Ich versuche, nach Nachnamen in absteigender Reihenfolge sortieren, dann grade, und haben diese example folgen.Java Comparator Mehrere Feld Sortierung funktioniert nicht
Ich bin nur durch den Nachnamen sortieren, aber nicht die Sorte sortieren. Was bekomme ich nicht?
@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;
}
ich nicht völlig bin immer, wie das genannte Beispiel in Bezug auf c == funktioniert 0, als c nie gleich Null ist, während es zu sortieren. Das lässt mich verstehen, warum die Noten nicht sortieren, aber das bringt mich nicht dorthin, wo ich es brauche.
Die Sortierung wird hier ausgeführt:
@Override
public void execute(List<Student> list) {
LastNameComparator cmp = new LastNameComparator(studentList);
Collections.sort(studentList, cmp);
}
Und die Testklasse ist wie folgt:
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());
}
}
Die Namen werden wie folgt generiert. Ich habe es von 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)];
}
}
UPDATE ich zu verstehen, dass dies nur funktioniert, wenn die Namen gleich sind. Dies ist, wo dies für mich nicht funktioniert, da der zufällige Namensgenerator eine geringe Chance hat, den gleichen Namen zweimal zu generieren. Ich schaue mir an, wie ich die Liste nach dem Nachnamen in absteigender Reihenfolge sortieren kann, dann nach der Note, ob die Namen gleich sind oder nicht. Wenn die Namen gleich sind, kommt die höhere Note zuerst.
'c' sollte gleich' 0' sein, wenn die Nachnamen immer gleich sind. Wenn Sie also mehrere Personen mit dem Nachnamen "Smith" haben, werden die "Smiths" nach Noten sortiert. Der Code, den Sie vorgestellt haben, sollte das tun. –
Ihr Code ist sehr verwirrend. Die Methode execute sortiert eine andere Liste als die, die an sie übergeben wurde. –
Warum nimmt der Konstruktor Ihres Parameters einen Parameter an? Das macht nicht viel Sinn ... – fabian