5
votes

Méthode Java compareTo niveau débutant

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:

  • entre 100 et 90-> 5;
  • entre 90 et 80 -> 4;
  • entre 80 et 70 -> 3
  • entre 70 et 60 -> 2
  • 1

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

}


2 commentaires

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/21626439


Notez que votre champ Mark est redondant et qu'il est dangereux car à moins que vous n'appeliez getMark () , sa valeur est erronée.


5 Réponses :


7
votes

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 comme

implements Comparable

3 commentaires

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.



2
votes

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.


0 commentaires

2
votes

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


0 commentaires

0
votes

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 :-)


0 commentaires

0
votes

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:

  • 0 - Si les paramètres que vous comparez sont égaux.
  • tout entier positif - Si l'argument est supérieur à l'objet que vous appellent la méthode depuis.
  • tout nombre négatif - Si l'argument est inférieur à l'objet que vous êtes appeler la méthode depuis.

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


0 commentaires