2016-03-25 13 views
1

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.

+2

'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. –

+0

Ihr Code ist sehr verwirrend. Die Methode execute sortiert eine andere Liste als die, die an sie übergeben wurde. –

+0

Warum nimmt der Konstruktor Ihres Parameters einen Parameter an? Das macht nicht viel Sinn ... – fabian

Antwort

0

Betrachten Student-Klasse wie unten

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; 
    } 

} 

Dann wird die Hauptfunktion korrekte Ausgabe unten gibt

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(); 
} 

}

AUSGABE:

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

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

Mike erscheint zuerst, da es alphabetisch geordnet ist. Und Vorname Milind ist für die nächsten 2 gleich, daher sortiert nach GPA.

Mit derselben Logik erhalten Sie auch Ihre Ausgabe basierend auf mehreren Feldern. in diesem Fall GPA, wenn Vorname gleich ist.

+0

Wenn alle drei Schüler unterschiedliche Nachnamen haben, wird das nicht nach Klassen sortiert, oder? Wie hier zu sehen ist, kommt Mike mit der höchsten Note zuerst, dann kommt Milind mit einer niedrigeren Note. – user25976

+0

Der Komparator wurde nur zur Überprüfung des Vornamens geschrieben. Also ja, wenn alle 3 Schüler unterschiedliche Nachnamen oder gleiche Nachnamen haben, ist es egal und die Ausgabe wird nur dann nach GPA sortiert, wenn die Vornamen gleich sind. Grundsätzlich erfolgt die Sortierung nur nach FirstName und wenn der Vorname gleich ist, dann nach GPA. Der Nachname kann gleich oder nicht sein. [Dies ist Wie der Komparator ich oben in der Klasse Student geschrieben habe] –

+0

Ich bin auf der Suche nach einer Lösung, die nach Nachnamen und gpa sortiert, ob die Namen gleich sind oder nicht. In Ihrem Beispiel würde es Mike 7.8, Milind, 7.73, Milind 7.7 gehen. Dieser Code ist der gleiche wie das Beispiel, das ich erwähnt habe, und bringt mich nicht dorthin, wo ich noch brauche. – user25976