Java学生排序

时间:2016-07-04 17:35:59

标签: java arrays sorting

我必须使用以下机制创建类SorterDemo。

sortDouble - sort array of double variables.

sortString - sort given String value in alphabetical manner.

sortStudent - sort array of Student objects based on marks.

我需要将这些函数排序为单个主类 SorterDemo 由于我正在使用比较运算符,在SorterDemo类中使用它时,它不允许我改变。

1 个答案:

答案 0 :(得分:0)

你希望它们都在SorterDemo类中,你可以将sortString类和sortStudent类放在SorterDemo类中作为嵌套类(你放{{1}在他们之前)。

更好的方法是拥有这样的东西:

static

正如你所看到的那样我们将两个比较器定义为Student类的静态字段,这就像“我们有两种方法来比较Student:by name和by marks”,我们为每个比较器分配一个lambda表达式。

lambda表达式可以很容易地为只有一个方法实现的接口添加实现(比如Comparator),语法如下:Class SorterDemo { static void sortString(Student[] stud) { Arrays.sort(stud,Student.namecomparator); } static void sortStudent(Student[] stud) { Arrays.sort(stud,Student.markscomparator); } public static void main(String[] args) { Student student[] = new Student[3]; // initializing unsorted double array double dArr[] = { 3.2, 1.2, 9.7, 6.2, 4.5 }; // let us print all the elements available in list for (double number : dArr) { System.out.println("Number = " + number); } // sorting array Arrays.sort(dArr); // let us print all the elements available in list System.out.println("The sorted double array is:"); for (double number : dArr) { System.out.println("Number = " + number); } student[0] = new Student(); student[0].setName("Nick"); student[0].setmarks(19); student[1] = new Student(); student[1].setName("Helen"); student[1].setmarks(12); student[2] = new Student(); student[2].setName("Ross"); student[2].setmarks(16); System.out.println("Order of students before sorting is: "); for (int i = 0; i < student.length; i++) { System.out.println(student[i].getName() + "\t" + student[i].getmarks()); } sortStudent(student); System.out.println("Order of students after sorting by student marks is"); for (int i = 0; i < student.length; i++) { System.out.println(student[i].getName() + "\t" + student[i].getmarks()); } sortString(student); System.out.println("Order of students after sorting by student name is"); for (int i = 0; i < student.length; i++) { System.out.println(student[i].getName() + "\t" + student[i].getmarks()); } } } class Student { static Comparator<Student> namecomparator=(s1,s2)->s1.getName().compareTo(s2.getName()); static Comparator<Student> markscomparator=(s1,s2)->Integer.compare(s1.getmarks(),s2.getmarks()); //the rest of class } (par1,par2,...)->expr,接口Runnable只有一个方法是(par1,par2,...)->{//block of code},因此我们可以像这样定义一个Runnable变量:void run

请注意,lambda表达式是在java 8中引入的,在java 7中你使用匿名类(没有名称的类),如下所示:

Runnable r=()->{//implementation for run method}

lambda表达式或匿名类使我们不仅仅为了实现接口而定义类,如果接口有多个方法要实现,你必须使用匿名类,即使在java 8中也是如此。

定义一个实现接口static Comparater<Student> namecomparator=new Comparator<Student> { @Override public int compare(Student s1,Student s2) { return s1.getName().compareTo(s2.getName()); } }; 的命名类是合理的,只有当该类除了A之外还有很多东西时,这至少是我的意见:)。

注意

A接口,你可以让Student类实现那个接口,更多关于Comparable和Comparator之间的区别可以找到here