2017-12-15 1 views
0

롤 번호별로 학생을 정렬하고 싶습니다. 병합 정렬을 사용하여 정수의 arraylist를 정렬하는 방법을 알고 있지만 Student 유형의 ArrayList를 정렬하는 것은 다릅니다.병합 정렬로 개체 속성 정렬

내 학생 클래스는 다음과 같은 속성을 포함

public static class Student 
    { 
     String name; 
     int rollNum, WebMark, dsMark, dmMark; 

     public Student(String name, int rollNum, int WebMark, int dsMark, int dmMark) 
     { 
      this.name = name; 
      this.rollNum = rollNum; 
      this.WebMark = WebMark; 
      this.dsMark = dsMark; 
      this.dmMark = dmMark; 
     } 
} 

나는 사람들이 객체의 속성의 ArrayLists를 정렬하는 비교기를 사용하여 보았다. 그러나, 그들은 (간단 함) 다음 줄과 같이 분류에 내장 위해 그것을 사용

Collections.sort(Database.arrayList, new CustomComparator()); 

그러나, 나는 내 학생 클래스에 쓴 내 머지 소트 기능을 사용하고 싶습니다. 그러나 나는 여전히 mergesort 함수에 'rollNum'속성을 전달할 방법을 알지 못하며 ArrayList의 다른 속성은 어떻게 이동 될까요? Google에서이 모든 것을 본 적이 없습니다. 아무것도 정렬하려면

package student; 
import java.util.List; 
import java.util.NoSuchElementException; 
import java.util.ArrayList; 
import java.util.Scanner; 
import java.util.Comparator; 

public class Main 
{ 
    public static class Student 
    { 
     String name; 
     int rollNum, WebMark, dsMark, dmMark; 

     public Student(String name, int rollNum, int WebMark, int dsMark, int dmMark) 
     { 
      this.name = name; 
      this.rollNum = rollNum; 
      this.WebMark = WebMark; 
      this.dsMark = dsMark; 
      this.dmMark = dmMark; 
     } 
     public String getName() 
     { 
      return name; 
     } 
     public int getRollNum() 
     { 
      return rollNum; 
     } 
     public int getWebMark() 
     { 
      return WebMark; 
     } 
     public int getDSMark() 
     { 
      return dsMark; 
     } 
     public int getDMMark() 
     { 
      return dmMark; 
     } 
     public static void addStudent(ArrayList<Student> studentArray) 
     { 
      Scanner input = new Scanner(System.in); 
      System.out.println("Enter Name: "); 
      String name = input.next(); 
      System.out.println("Enter Roll Number"); 
      int rollNum = input.nextInt(); 
      System.out.println("Enter Web Mark:"); 
      int webMark = input.nextInt(); 
      System.out.println("Enter Data Structure Mark:"); 
      int DSMark = input.nextInt(); 
      System.out.println("Enter Discrete Math Mark:"); 
      int DMMark = input.nextInt(); 
      //create this student profile in array 
      Student newStudent = new Student(name,rollNum,webMark,DSMark,DMMark); 
      studentArray.add(newStudent); 
     } 
     public static void findStudent(int rollNum, ArrayList<Student> studentArr) 
     { 
      for(int i = 0; i < studentArr.size(); i++) 
      { 
       if(studentArr.get(i).getRollNum()==rollNum) 
       { 
        System.out.println("Roll Number: " + studentArr.get(i).getRollNum() + 
             ", Name: " + studentArr.get(i).getName() + 
             ", Web Grade: " + studentArr.get(i).getWebMark() + 
             ", Data Structure Grade: " + studentArr.get(i).getDSMark() + 
             ", Discrete Math Grade: " + studentArr.get(i).getDMMark()); 
       } 
       else 
       { 
        System.out.println("Couldn't find student."); 
       } 
      } 
     } 
     public static void deleteStudent(ArrayList<Student> studentArr) 
     { 
      System.out.println("Enter Student Roll Number: "); 
      Scanner input = new Scanner(System.in); 
      int rollNum = input.nextInt(); 
      for(int counter = 0; counter < studentArr.size(); counter++) 
      { 
       if(studentArr.get(counter).getRollNum() == rollNum) 
       { 
        studentArr.remove(counter); 
       } 
      } 
     } 

     public String toString() 
     { 
      return name + " " + rollNum + " " + WebMark + " " + dsMark + " " + dmMark; 
     } 

     public static double avg(ArrayList<Student> studentArr) 
     { 
      double[] avgArr = new double[studentArr.size()]; 
      double max = 0.0; 
      for(int counter = 0; counter < studentArr.size(); counter++) 
      { 
       avgArr[counter] = (studentArr.get(counter).getWebMark() + 
         studentArr.get(counter).getDSMark() + studentArr.get(counter).getDMMark())/(3); 

       if(avgArr[counter] > max) 
       { 
        max = avgArr[counter]; 
       } 
      } 
      return max; 
     } 

     public int compareTo(Student studCompare) 
     { 
      int compareRollNum = ((Student) studCompare).getRollNum(); 

      //ascending order 
      return this.rollNum - compareRollNum; 
     } 

     /*Comparator for sorting the array by student name*/ 
     public static Comparator<Student> StuNameComparator = new Comparator<Student>() 
     { 
      public int compare(Student s1, Student s2) 
      { 
       String StudentName1 = s1.getName().toUpperCase(); 
       String StudentName2 = s2.getName().toUpperCase(); 

       //ascending order 
       return StudentName1.compareTo(StudentName2); 

       //descending order 
       //return StudentName2.compareTo(StudentName1); 
      } 
     }; 

     /*Comparator for sorting the array by student name*/ 
     public static Comparator<Student> StuRollno = new Comparator<Student>() 
     { 
      public int compare(Student s1, Student s2) 
      { 
       int rollno1 = s1.getRollNum(); 
       int rollno2 = s2.getRollNum(); 

       //ascending order 
       return rollno1-rollno2; 

       //descending order 
       //return StudentName2.compareTo(StudentName1); 
      } 
     }; 

     public static <T extends Comparable<T>> List<T> mergeSort(List<T> m) 
     { 
      // exception 
      if (m==null) throw new NoSuchElementException("List is null"); 
      // base case 
      if (m.size() <= 1) return m; 

      // make lists 
      List<T> left = new ArrayList<>(); 
      List<T> right = new ArrayList<>(); 

      // get middle 
      int middle = m.size()/2; 

      // fill left list 
      for (int i = 0; i < middle; i++) 
      { 
       if (m.get(i)!=null) left.add(m.get(i)); 
      } 

      // fill right list 
      for (int i = middle; i < m.size(); i++) 
      { 
       if (m.get(i)!=null) right.add(m.get(i)); 
      } 

      // recurse 
      left = mergeSort(left); 
      right = mergeSort(right); 

      // merge 
      return merge(left,right); 
     } 

     private static <T extends Comparable<T>> List<T> merge(List<T> left, List<T> right) 
     { 
      List<T> result = new ArrayList<>(); 

      // merge 
      while (!left.isEmpty() && !right.isEmpty()) 
      { 
       if (left.get(0).compareTo(right.get(0)) <= 0) 
       { 
        result.add(left.remove(0)); 
       } 
       else 
       { 
        result.add(right.remove(0)); 
       } 
      } 

      // cleanup leftovers 
      while (!left.isEmpty()) 
      { 
       result.add(left.remove(0)); 
      } 
      while (!right.isEmpty()) 
      { 
       result.add(right.remove(0)); 
      } 
      return result; 
     } 

    } 

    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 
     int userChoice = 0; 
     int userChoice2 = 0; 
     ArrayList<Student> studentArr = new ArrayList<Student>(); //array size is 6 

     System.out.println("1- Merge Sort"); 
     System.out.println("2- Shell Sort"); 
     System.out.println("3- Quit"); 
     userChoice2 = input.nextInt(); 

     if (userChoice2 == 1 || userChoice2 == 2) 
     { 
      do { 
       System.out.println("1- Add a New Record"); 
       System.out.println("2- Sort by Student Name"); 
       System.out.println("3- Sort by Roll Number"); 
       System.out.println("4- Delete a Student Specific Record"); 
       System.out.println("5- Display a Student Specific Record"); 
       System.out.println("6- Search"); 
       System.out.println("7- Display the Highest Average"); 
       System.out.println("8- Print"); //print the array size, sort time, and number of comparisons to the screen. 
       System.out.println("9- Quit"); 
       System.out.println("Select your Option: \n"); 

       userChoice = input.nextInt(); 

       switch (userChoice) { 
       case 1: 
        Student.addStudent(studentArr); 
        break; 
       case 2: 
        if (userChoice2 == 1) { 
         //call mergesort function 
        } else if (userChoice2 == 2) { 
         //call shell sort function 
        } 
       case 3: 
        if (userChoice2 == 1) { 
         //call mergesort function 
        } else if (userChoice2 == 2) { 
         //call shell sort function 
        } 
       case 4: 
        Student.deleteStudent(studentArr); 
        break; 
       case 5: 
        System.out.println("Enter Student Roll Number: "); 
        int rollNum_ = input.nextInt(); 
        Student.findStudent(rollNum_, studentArr); 
        break; 
       case 6: 
       case 7: 
        double highestAvg = Student.avg(studentArr); 
        System.out.println("Highest Average is: " + highestAvg); 
        break; 
       case 8: 
        System.out.println("Printing students..."); 
        System.out.print(studentArr); 
        System.out.println("\n"); 
        break; 
       case 9: 
       } 
      } while (userChoice != 9); 
     } 
     else 
     { 
      return; 
     } 
     input.close(); 
    } 
} 

답변

0

는, 객체가 다소으로 비교해야합니다 :

여기 내 전체 코드입니다. 자바에서는 객체와 같은 두 가지 방법이 있습니다 (예 : 학생) 비교 가능 및 비교 자.

당신의 객체는 Comparable 인터페이스를 구현하고 필요한 메소드 compareTo의 구현을 작성해야합니다. 여기서 compareTo는 서로 비교할 방법을 나열합니다.

또 다른 방법은 Comparator 인터페이스를 구현하고 compare 메소드를 구현하는 것입니다.

일단 완료되면 Collection.sort ..... 메소드를 사용하여 콜렉션을 정렬 할 수 있습니다.

+0

안녕 Zeimer, 병합 정렬을 사용하여 컬렉션을 정렬하고 싶습니다. 그게 가능하니? – SaidAlbahri

1

귀하의 Student 이미 Comparable이며 이미가 rollNum 필드를 사용하여 다른 Student 인스턴스에 비교 때문에 현재 구현이 compareTo()를 사용해야 이미 일종의 해당 필드에.

그러나 다른 순서를 사용하여 정렬 할 경우, 당신은 Comparator를 작성할 수 등처럼 정렬 방법을 변경 :

private static <T> List<T> merge(List<T> left, List<T> right, Comparator<? super T> comparator) { 
    .. use comparator.compare(a, b) instead of a.compareTo(b) 
} 

를 여기, 당신은 ComparableT을 제한 할 필요가 없습니다.

+0

다른 순서에 따라 병합 정렬을 사용하여 정렬하는 것을 의미합니까? 그게 내가이 사건에서하고 싶은 일이야. – SaidAlbahri

+0

다른 순서로, 나는 다른 기준으로 정렬하는 것을 의미합니다 : 예를 들어, 학생의 이름에 의한 순서 지정, 다른 것의 표식 사용. 나는 '다른 정렬 알고리즘'을 의미하지는 않습니다. –

+0

이 시나리오에서 병합 정렬은 어떻게 구현합니까? rollNum 필드를 사용합니다. – SaidAlbahri