Comparateur Interface implémentée dans une classe imbriquée
Je suis nouveau sur stackoverflow.com mais j'ai souvent utilisé pour trouver des réponses à chaque fois que j'avais un problème, mais maintenant je ne trouve pas de résultat de recherche pour mon problème donc je pose la question ici 🙂
Je fais les études pour la OCPJP SE 7 de certification, examen 1Z0-804, et je suis à l'aide d'un livre (il y a seulement un de disponible autant que je sache, Ganesh\Sharma)
Dans les collections du chapitre, au sujet de la Comparaison de l'interface, le livre de fournir cet exemple d'utiliser à la fois le Comparateur et l'interface Comparable pour trier un tableau de l'Étudiant les éléments, mais la question est sur le Comparateur de:
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));
}
}
De sorte qu'il crée une nouvelle classe seulement pour l'utilisation du Comparateur de l'interface avec deux Étudiants objets, mais je pense que c'est très mal à l'aise alors je me demande: pourquoi ne puis-je pas utiliser une classe imbriquée (au sein de l'Étudiant)? Comme ceci:
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));
}
}
Le livre ne dit rien à propos de l'utilisation de classes imbriquées au lieu de la normale, mais je ne vois pas pourquoi il devrait en être de mauvais à faire comme ça... Est-il un problème avec mon code (le 2ème)? Dois-je suivre ce que le livre dit, parce que ma mise en œuvre de la Comparaison est mal? (Note: le code se compile et s'exécute sans problème, avec la sortie attendue dans les deux cas)
[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]
S'il vous plaît aider 😀 Merci d'avance.
Si vous utilisez un
Comparator
, alors c'est bien pratique pour mettre sa source dans un fichier séparé. Ce n'est pas un argument pour ou contre la nidification de la Comparator
classe. Très probablement, la livre à partir de laquelle la source d'origine est tracée la présente comme il le fait pour des raisons de commodité et de clarté.
OriginalL'auteur RaffoSorr | 2014-10-07
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mettre en œuvre un
Comparator
comme statique de la classe imbriquée de l'être comparé, si vous êtes en contrôle de la classe (et si c'est une classe plutôt qu'une interface). Il n'est pas rare, cependant, que vous souhaitez comparer les instances d'une classe que vous ne contrôlez pas, selon un ordre qui la classe cible ne prend pas en charge nativement (en étantComparable
ou en fournissant uneComparator
classe). Dans ce cas, vous devez créer votre propreComparator
.Même lorsque vous contrôlez tout, c'est un peu une question de goût que de mettre en œuvre
Comparator
s que les classes de niveau supérieur. Je ne sais pas pourquoi vous l'appelez "mal à l'aise"; moi, je préfère en général éviter les classes imbriquées quand je peux. Il est à noter que si vous nid ou pas, leComparator
mise en œuvre de la classe sera compilé dans un fichier de classe.OriginalL'auteur John Bollinger
Il n'y a aucune raison pourquoi vous ne devriez pas réellement mettre en œuvre les deux
Comparable
etComparator
.Il est souvent plus approprié, cependant, de mettre en œuvre seul
Comparable
et d'utiliser d'autres méthodes (telles que les classes internes anonymes ou de classes) pour choisir les différents ordres.Voir ici pour la poursuite des discussions.
Comment est-ce pertinent à la question sur l'utilisation d'une classe imbriquée à mettre en œuvre
Comparator
?Bien sûr, mais vous pourriez avoir besoin à l'ordre les Élèves par leur nom, dans certains cas, et par leur moyenne dans les autres cas, et lorsque vous avez besoin de deux ou de plusieurs implémentations de la méthode de comparaison vous ne pouvez pas le mettre en œuvre dans la classe qui doit être comparé, droit? Mais si j'ai besoin de deux différents de mise en œuvre, je peux simplement créer deux classes imbriquées, disent les Étudiants.StudentCGPA et l'Élève.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).
peut-être que ma question n'est pas pertinente à sa question, mais alors, votre réponse n'a rien à voir avec sa question soit.. parce que ce qui a été posée est: "pourquoi ne puis-je pas utiliser une classe imbriquée (au sein de l'Étudiant)?". Et non pas "pourquoi ne devrais-je pas mettre en œuvre
Comprataor
etComparable
?"...OriginalL'auteur OldCurmudgeon