2017-12-15 7 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; 
     } 
} 

私は、人々は、オブジェクトのプロパティののArrayListをソートするコンパレータを使用して見てきました。しかし、彼らは組み込みの次の行(簡単です)のように並べ替えのためにそれを使用します。

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

しかし、私は私の学生のクラスで書いた私のマージ機能を使用したいです。しかし、私はまだ、プロパティ 'rollNum'をmergesort関数に渡す方法を理解していないし、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

何かをソートするために、オブジェクトが多少により、同等でなければなりません。 Javaでは、オブジェクトのために(学生のように)それを行う2つの方法があります: ComparableとComparator。

あなたのオブジェクトはComparableインターフェイスを実装し、必要なメソッドcompareToの実装を記述し、次にcompareToメソッドを実装してお互いを比較する必要があります。

もう1つの方法は、Comparatorインタフェースを実装し、compareメソッドを実装することです。

これが完了したら、Collection.sort .....メソッドを使用してコレクションをソートできます。 compareTo()を使用して、現在の実装では、すでにその場に並べ替える必要がありますので、

+0

こんにちはZeimer、私はマージソートでコレクションをソートしたいと思います。それは可能ですか? – SaidAlbahri

1

あなたStudentが既にすでにComparableあり、それは、rollNumフィールドを使用して他のStudentインスタンスを比較します。

しかし、あなたは別の順序を使用してソートする場合は、あなたが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

関連する問題