我必须使用以下机制创建类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
类中使用它时,它不允许我改变。
答案 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