J'ai un devoir dans lequel je dois créer une classe Student dans laquelle vous stockez le code neptun de l'étudiant (String nep_c) et le nombre de points que vous avez obtenus à l'examen (int point_num). Préparez une méthode publique int getMark () qui retourne le ticket obtenu à l'examen en fonction du score selon le tableau suivant:
La classe implémente l'interface Comparable et la méthode compareTo () trie les étudiants en fonction du code neptun. À l'intérieur, par le nombre de points que vous obtenez. Malheureusement, je ne comprends pas la méthode comperTo. Pouvez-vous m'aider comment écrire le bon code?
public class Student implements Comparable{ private String nep_c; private int point_num; private int Mark; public Student(int point_num, String nep_c) { this.point_num = 65; this.nep_c= "AAA1BB1"; } public int getMark(){ if (point_num <= 100 && point_num > 90) Mark = 5; else if (point_num <= 90 && point_num > 80) Mark = 4; else if (point_num <= 80 && point_num > 70) Mark = 3; else if (point_num <= 70 && point_num > 60) Mark = 2; else if (point_num <= 60) Mark = 1; else{ return 0; } return Mark; } public String getNep_c(){ return nep_c; } public int getPoint_num(){ return point_num; } @Override public int compareTo (Object o){ return ???; }
}
5 Réponses :
trier les élèves en fonction du code neptun
Deux parties. Première partie, remplacez
return Comparator.comparing(Student::getNep_c) .thenComparingInt(Student::getMark).compare(this, o);par
int c = this.nep_c.compareTo(o.nep_c); if (c != 0) { return c; } return Integer.compare(getMark(), o.getMark());Et puis
@Override public int compareTo(Student o) { return Integer.compare(getMark(), o.getMark()); }Cependant, vous dites alors À l'intérieur, par le nombre de points que vous obtenez. alors peut-être que vous voulez vraiment@Override public int compareTo(Student o) { return this.nep_c.compareTo(o.nep_c); }Si vous voulez trier par le code neptun, et utilisez la ou les marque (s) comme bris d'égalité, vous pouvez alors faire quelque chose comme
implements Comparable<Student>Ou, en Java 8+, en utilisant
Comparator.comparing
commeimplements Comparable
Par En son sein, par le nombre de marques que vous obtenez , je pense que Lajos signifie que si les nep_c
sont égaux, les notes sont alors comparées.
@BillyBrown peut-être . plus ajouté à la réponse pour essayer de couvrir les possibilités.
Je ne connaissais pas Comparator.comparing
; cela aide définitivement à combattre le passe-partout. J'ai voté pour votre réponse, car c'est un bon guide étape par étape.
compareTo
obtient Object
parce que vous implémentez Comparable
, plutôt que générique Comparable
. C'est pourquoi il est difficile de voir ce qui doit être fait.
Modifiez votre code comme suit:
public class Student implements Comparable<Student> { ... @Override public int compareTo(Student other) { ... } }
Maintenant, dans l'implémentation, comparez nep_c code > de cet élève à
other.nep_c
. Si ces deux ne sont pas égaux, renvoyez le résultat de la comparaison; sinon, retournez le résultat de la comparaison des marques.
Remarque: Il y a un problème avec votre méthode getMark
: elle renvoie 1 code > pour les élèves avec 60 points alors qu'il devrait renvoyer 2, et il attribue également un champ privé
Mark
qui pourrait être converti en une variable locale.
Le compareTo
sur une méthode Comparable
prend une valeur à laquelle il compare l'objet actuel et doit renvoyer:
-1
si l'objet courant précède l'autre objet (tout entier négatif peut être utilisé), 0
si les deux objets sont égaux, 1
si l'objet courant vient après l'autre objet (n'importe quel entier positif peut être utilisé). Si vous souhaitez comparer deux objets par deux champs différents, vous devez faire ce qui suit (assurez-vous de mettre en œuvre Comparable
):
@Override public int compareTo(Student other) { final int comparedNepCode = nep_c.compareTo(other.nep_c); if (comparedNepCode == 0) { return Integer.compare(getMark(), other.getMark()); } return comparedNepCode; }
Lors de la comparaison des nombres, soustraire l'autre de l'actuel donne un ordre croissant, donc:
x x - y
x = y
x - y = 0
x> y
x - y> 0
Pour plus d'informations, consultez le compaterTo withibn de Java.
compareTo est une fonction qui doit renvoyer un entier. L'idée est que (par exemple) tout algorithme de tri externe l'utilise pour comparer un objet (de type Student, dans votre cas) avec un autre. Dans la routine de tri (que vous n'aurez probablement pas écrite: elle est intégrée à la collecte), il a besoin d'un moyen de déterminer qui est le plus `` le plus élevé '' par rapport à un autre étudiant, et c'est ce que compareTo fournit.
Donc dans votre cas, dans compareTo, c'est quelque chose comme ...
return -1 if Object o.point_num < this.point_num return 1 if Object o.point_num > this.point_num return 0 if Object o.point_num = this.point_num
(ce n'est pas du code java d'ailleurs, juste des notes)
Notez que compareTo ne fait pas réellement le tri. Pour cela, vous aurez besoin d'une collection (un type de tableau) d'objets Student. L'objet Collection doit avoir une méthode '.sort' intégrée.
Quant au type de collection: dépend de vos besoins. Google est votre ami ici :-)
La méthode compareTo est utilisée pour comparer deux objets en spécifiant les paramètres à comparer dans le corps de la méthode. Mais je suppose que vous avez déjà compris cette partie.
Vous devrez renvoyer une valeur entière basée sur la comparaison que vous essayez de faire. Il y a 3 cas de retour:
Par exemple, j'utilise -1 si cet argument>, 0 si ceci = argument, 1 si cet argument <. La méthode de tri se chargera ensuite de trier les éléments en fonction de la valeur de retour de la méthode. Voici un exemple
Il est utile de lire la documentation de
Comparable
, si vous ne l'avez pas déjà fait. Cette question peut également aider: stackoverflow.com/questions/21626439Notez que votre champ
Mark
est redondant et qu'il est dangereux car à moins que vous n'appeliezgetMark ()
, sa valeur est erronée.