gpt4 book ai didi

Java比较器多字段排序不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:52 24 4
gpt4 key购买 nike

我正在尝试按姓氏降序排序,然后进行评分,并且一直在关注此 example .

但是,我只进行了姓氏排序,而不是年级排序。我没有得到什么?

@Override
public int compare(Student o1, Student o2) {
int c;
c = o1.getLastName().compareToIgnoreCase(o2.getLastName());
if (c == 0) {
c = Double.compare(o1.getGrade(), o2.getGrade());
}
return c;
}

我没有完全理解上述示例在 c == 0 方面的工作原理,因为 c 在排序时永远不会等于零。这让我明白为什么成绩没有排序,但这并没有让我到达我需要的地方。

排序在这里执行:

@Override
public void execute(List<Student> list) {
LastNameComparator cmp = new LastNameComparator(studentList);
Collections.sort(studentList, cmp);

}

测试类是这样的:

public static void main(String[] args) {
// TODO code application logic here

for (int i = 0; i < 20; i++) {
Student student = new Student(randomInteger(1,50), NameGenerator.generateName(), NameGenerator.generateName(), Math.round(Math.random()*10.0)/10.0);
studentList.add(student);
}
System.out.println("--Unsorted--");

for (Student student : studentList) {
System.out.println(student.getStudentID());
System.out.println(student.getFirstName());
System.out.println(student.getLastName());
System.out.println(student.getGrade());
}

Command sortLastName = new LastNameComparator(studentList);
sortLastName.execute(studentList);

System.out.println("--Sorted--");


for (Student student : studentList) {
System.out.println(student.getStudentID());
System.out.println(student.getFirstName());
System.out.println(student.getLastName());
System.out.println(student.getGrade());
}
}

名称是这样生成的。我从 here 得到的:

public class NameGenerator {
private static String[] Beginning = { "Kr", "Ca", "Ra", "Mrok", "Cru",
"Ray", "Bre", "Zed", "Drak", "Mor", "Jag", "Mer", "Jar", "Mjol",
"Zork", "Mad", "Cry", "Zur", "Creo", "Azak", "Azur", "Rei", "Cro",
"Mar", "Luk" };
private static String[] Middle = { "air", "ir", "mi", "sor", "mee", "clo",
"red", "cra", "ark", "arc", "miri", "lori", "cres", "mur", "zer",
"marac", "zoir", "slamar", "salmar", "urak" };
private static String[] End = { "d", "ed", "ark", "arc", "es", "er", "der",
"tron", "med", "ure", "zur", "cred", "mur" };

private static Random rand = new Random();

public static String generateName() {

return Beginning[rand.nextInt(Beginning.length)] +
Middle[rand.nextInt(Middle.length)]+
End[rand.nextInt(End.length)];

}
}

更新 据我所知,只有名称相同时这才有效。这对我来说不起作用,因为随机名称生成器生成相同名称两次的机会很小。我正在研究如何获得按姓氏降序排序的列表,然后按年级排序,无论姓名是否相同。如果名字相同,等级高的在前。

最佳答案

考虑学生类(class)如下

public class Student implements Comparable<Student> {
String name;
int id;
double gpa;

public Student(String name, int id, double gpa) {
this.name = name;
this.id = id;
this.gpa = gpa;
}

@Override
public int compareTo(Student o2) {
int c;
c = this.name.compareToIgnoreCase(o2.name);
if (c == 0) {
c = Double.compare(this.gpa, o2.gpa);
}
return c;
}

}

然后下面的主函数给出正确的输出

public static void main(String[] args) {

ArrayList<Student> studentList = new ArrayList<Student>();
studentList.add(new Student("Milind", 1, 7.73));
studentList.add(new Student("Milind", 1, 7.70));
studentList.add(new Student("Mike", 1, 7.80));
System.out.println("--Unsorted--");

for (Student student : studentList) {
System.out.print(student.name + ": ");
System.out.print(student.gpa);
System.out.println();
}
System.out.println();

Collections.sort(studentList);
System.out.println("--Sorted--");

for (Student student : studentList) {
System.out.print(student.name + ": ");
System.out.print(student.gpa);
System.out.println();
}

}

输出:

--Unsorted--
Milind: 7.73
Milind: 7.7
Mike: 7.5

--Sorted--
Mike: 7.8
Milind: 7.7
Milind: 7.73

迈克首先出现,因为它是按照字母顺序排列的。接下来的 2 个名字 Milind 相同,因此根据 GPA 排序。

应用相同的逻辑,您还将获得基于多个字段的输出。在这种情况下,名字相同时的 GPA。

关于Java比较器多字段排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36227987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com