Comparator-Interface implementiert, in einer geschachtelten Klasse
Ich bin neu auf stackoverflow.com aber habe ich oft verwendet, um die Suche nach Antworten, Wann immer ich ein problem hatte, aber jetzt kann ich nicht finden Ergebnis auf der Suche für mein problem, also Frage ich hier 🙂
Ich studiere für die OCPJP SE 7-Zertifizierung Prüfung 1Z0-804, und ich bin mit einem Buch (es gibt nur eine verfügbar ist, soweit ich weiß, Ganesh\Sharma)
In den Kollektionen Kapitel, über das Comparator-interface, das Buch bieten dieses Beispiel für die Verwendung der Komparator und der Vergleichbaren Schnittstelle ein array Sortieren der Student Elemente, aber die Frage ist über den Komparator:
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
}
class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
So schafft es eine neue Klasse nur für die Verwendung des Comparator-interface mit zwei Student-Objekte, aber ich denke, das ist sehr unangenehm, so Frage ich mich: warum kann ich nicht verwenden eine verschachtelte Klasse (innerhalb Student)? Wie diese:
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
static class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new Student.StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
Des Buches sagt nichts über die Verwendung von verschachtelten Klassen statt der normalen, aber ich kann nicht sehen, warum sollte es schlecht sein zu tun, wie dieser... gibt es irgendein problem mit meinem code (die 2.)? Sollte ich dem Folgen, was das Buch sagt, weil meine Implementierung der Komparator ist falsch? (Hinweis: der code wird kompiliert und läuft ohne problem, mit dem erwarteten Ausgang in beiden Fällen)
[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]
Bitte helfen 😀 Danke im Voraus.
Wenn Sie eine separate
Comparator
dann ist es gute Praxis, um Ihre Quelle in einer separaten Datei. Das ist kein argument für oder gegen die Verschachtelung der Comparator
Klasse. Sehr wahrscheinlich, dass das Buch, aus denen die original-Quelle gezogen wird, stellt es, da es für Komfort und Klarheit.
InformationsquelleAutor RaffoSorr | 2014-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie implementieren eine
Comparator
als statische verschachtelte Klasse von der man verglichen wird, wenn Sie sind in der Steuerung, die Klasse (und wenn es eine Klasse sondern ein interface). Es ist überhaupt nicht selten, jedoch, dass Sie wollen, vergleichen, Instanzen einer Klasse, die du nicht kontrollierst, nach einer Ordnung, die das Ziel der Klasse nicht nativ unterstützen (ob durchComparable
oder durch die Bereitstellung einerComparator
Klasse). In diesem Fall müssen Sie erstellen Sie Ihren eigenen, separatenComparator
.Selbst wenn Sie alles kontrollieren, es ist etwas eine Frage des Geschmacks, ob zu implementieren
Comparator
s als top-level-Klassen. Ich bin mir nicht sicher, warum Sie nennen es "unbequem"; ich selbst, ich in der Regel lieber vermeiden Sie geschachtelte Klassen können als ich. Beachten Sie auch, dass, ob Sie nest oder nicht, dieComparator
Umsetzung die Klasse wird kompiliert, um ein separates class-Datei.InformationsquelleAutor John Bollinger
Gibt es keinen wirklichen Grund, warum sollten Sie nicht auch tatsächlich umzusetzen beide
Comparable
undComparator
.Ist es oft angemessener, allerdings implementieren nur
Comparable
und verwenden Sie andere Methoden (wie die inneren Klassen oder anonymen Klassen), um zu wählen, verschiedene Aufträge.Sehen hier für die weitere Diskussion.
Wie ist das relevant für die Frage über die Verwendung einer geschachtelten Klasse zu implementieren
Comparator
?Sicher, aber Sie müssen möglicherweise um Studenten, indem Sie deren Namen in einigen Fällen und durch Ihre cgpa in anderen Fällen, und Sie müssen zwei oder mehr verschiedenen Implementierungen der Methode vergleichen, die Sie nicht umsetzen können Sie es in der Klasse, muss verglichen werden, richtig? Aber wenn ich zwei unterschiedliche Umsetzung kann ich Sie einfach erstellen Sie zwei geschachtelte Klassen, sagt der Student.StudentCGPA und Schüler.StudentName
compareTo(): To give an idea about sorting the objects to the user of your class, here user who is going to use "Student" class compare() : If the developer didn't provide the compareTo() method to compare or user wants to change the logic to compare two objects of the same class without changing the code of the class itself(Student).
naja, vielleicht ist meine Frage nicht relevant ist, auf seine Frage, dann aber Ihre Antwort hat nichts zu tun mit seiner Frage entweder.. denn was gefragt wurde, ist: "warum kann ich nicht verwenden eine verschachtelte Klasse (innerhalb Student)?". Und nicht "warum sollte ich nicht umsetzen
Comprataor
undComparable
?"...InformationsquelleAutor OldCurmudgeon