Comment puis-je écrire une méthode compareTo qui compare les objets?

J'apprends sur les tableaux, et fondamentalement j'ai un tableau qui recueille un nom de famille, un prénom et un score.

J'ai besoin d'écrire une méthode compareTo qui comparera le nom de famille puis le prénom afin que la liste puisse être triée par ordre alphabétique en commençant par les noms de famille, puis si deux personnes ont le même nom de famille, alors il va trier le prénom.

Je suis confus, car toutes les informations de mon livre comparent des nombres, pas des objets et des chaînes.

Ici est ce que j'ai codé jusqu'à présent. Je sais que c'est faux mais ça explique au moins ce que je pense faire:

public int compare(Object obj) // creating a method to compare 
{   
    Student s = (Student) obj; // creating a student object

    // I guess here I'm telling it to compare the last names?
    int studentCompare = this.lastName.compareTo(s.getLastName()); 

    if (studentCompare != 0)
        return studentCompare;
    else 
    {
        if (this.getLastName() < s.getLastName())
            return - 1;

        if (this.getLastName() > s.getLastName())
            return 1;
    }
    return 0;
}

Je sais que les symboles < et > sont faux, mais comme je l'ai dit, mon livre ne vous montre que comment utiliser le compareTo.

28
demandé sur Radiodef 2012-04-04 22:46:09

9 réponses

C'est la bonne façon de comparer les chaînes:

int studentCompare = this.lastName.compareTo(s.getLastName()); 

Cela ne compile même pas:

if (this.getLastName() < s.getLastName())

Utilisation if (this.getLastName().compareTo(s.getLastName()) < 0) à la place.

Donc, pour comparer l'ordre du poing / nom de famille, vous avez besoin:

int d = getFirstName().compareTo(s.getFirstName());
if (d == 0)
    d = getLastName().compareTo(s.getLastName());
return d;
24
répondu Eugene Retunsky 2012-04-04 18:48:11

La méthode compareTo est décrite comme suit:

Compare cet objet avec l'objet spécifié pour l'ordre. Retourne un entier négatif, zéro ou un entier positif car cet objet est inférieur supérieur, égal ou supérieur à l'objet spécifié.

Disons que nous aimerions comparer les Jedis par leur âge:

class Jedi implements Comparable<Jedi> {

    private final String name;
    private final int age;
        //...
}

Alors si notre Jedi est plus âgé que celui fourni, vous devez retourner un positif, s'ils ont le même âge, vous retournez 0, et si notre Jedi est plus jeune, vous retournez un négatif.

public int compareTo(Jedi jedi){
    return this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
}

En implémentant la méthode compareTo (provenant de l'interface Comparable), vous définissez ce qu'on appelle un ordre naturel . Toutes les méthodes de tri dans JDK utiliseront cet ordre par défaut .

Il existe des ocassions dans lesquelles vous pouvez baser votre comparaison dans d'autres objets, et non sur un type primitif. Par exemple, copare Jedis basé sur leurs noms. Dans ce cas, si les objets comparés implémentent déjà Comparable Ensuite, vous pouvez faire la comparaison en utilisant sa méthode compareTo.

public int compareTo(Jedi jedi){
    return this.name.compareTo(jedi.getName());
}

Ce serait plus simple dans ce cas.

Maintenant, si vous voulez utiliser à la fois le nom et l'âge comme critères de comparaison, alors vous devez décider de Votre oder de comparaison, ce qui a préséance. Par exemple, si deux Jedis sont nommés de la même manière, alors vous pouvez utiliser leur âge pour décider qui va en premier et qui va en second.

public int compareTo(Jedi jedi){
    int result = this.name.compareTo(jedi.getName());
    if(result == 0){
        result = this.age > jedi.age ? 1 : this.age < jedi.age ? -1 : 0;
    }
    return result;
}

Si vous aviez un tableau de Jedis

Jedi[] jediAcademy = {new Jedi("Obiwan",80), new Jedi("Anakin", 30), ..}

Tout ce que vous avez à faire est de demander à la classe java.util.Arrays pour utiliser sa méthode de tri.

Arrays.sort(jediAcademy);

Cette méthode Arrays.sort utilisera votre méthode compareTo pour trier les objets un par un.

18
répondu Edwin Dalorzo 2012-04-04 19:08:39

Écoutez @milkplusvellocet, je vous recommande d'implémenter l'interface Comparable à votre classe.

Juste contribuer aux réponses des autres:

String.compareTo() vous dira à quel point une chaîne est différente d'une autre.

Par exemple {[1] } imprimera -1 et System.out.println( "Test".compareTo("Tesa") ); imprimera 19

Et ringard et geek solution d'une ligne à cette tâche serait:

return this.lastName.equals(s.getLastName()) ? this.lastName.compareTo(s.getLastName()) : this.firstName.compareTo(s.getFirstName());

Explication:

this.lastName.equals(s.getLastName()) vérifie si les noms de famille sont identiques ou non this.lastName.compareTo(s.getLastName()) si oui, alors renvoie la comparaison du nom de famille. this.firstName.compareTo(s.getFirstName()) si ce n'est pas le cas, renvoie la comparaison du prénom.

2
répondu Khôi 2012-04-04 19:04:34

Vous êtes presque tout le chemin.

Vos premières lignes, comparant le nom de famille, sont sur la bonne voie. La méthode compareTo () sur string renverra un nombre négatif pour une chaîne dans l'ordre alphabétique avant, et un nombre positif pour un dans l'ordre alphabétique après.

Maintenant, vous avez juste besoin de faire la même chose pour votre prénom et votre score.

En d'autres termes, si le nom de famille 1 == Nom de famille 2, allez vérifier votre prénom suivant. Si le prénom est le même, vérifiez votre score suivant. (Pensez à imbriquer vos blocs if / then.)

1
répondu Jonathan B 2012-04-04 18:50:52

Pensez à utiliser l'interface Comparator décrite ici qui utilise des génériques afin d'éviter de lancer Object vers Student.

Eugène Retunsky dit, votre première partie est la bonne façon de comparer les Strings. Aussi, si le lastNames sont égaux, je pense que vous vouliez comparer firstNames, auquel cas il suffit d'utiliser compareTo de la même manière.

1
répondu darrengorman 2012-04-04 18:54:04

if (s.compareTo(t) > 0) comparera la chaîne s à la chaîne t et retournera la valeur int que vous voulez.

    public int Compare(Object obj) // creating a method to compare {   
        Student s = (Student) obj; //creating a student object

        // compare last names
        return  this.lastName.compareTo(s.getLastName());    
    }

Maintenant, il suffit de tester un retour négatif positif de la méthode comme vous l'auriez normalement fait.

Santé

1
répondu RyanS 2012-04-04 18:55:58

Une chaîne est un objet en Java.

, Vous pouvez comparer comme ça,

if(this.lastName.compareTo(s.getLastName() == 0)//last names are the same
0
répondu ChadNC 2012-04-04 18:51:47

Je n'aurais pas de paramètre de type D'objet, inutile de le lancer à Student si nous savons qu'il sera toujours de Type Student.

Comme pour une explication, "result = = 0" ne se produira que lorsque les noms de famille sont identiques, à quel point nous comparons les prénoms et retournons cette valeur à la place.

public int Compare(Object obj)
{       
    Student student = (Student) obj;
    int result = this.getLastName().compareTo( student.getLastName() );

    if ( result == 0 )
    {
        result = this.getFirstName().compareTo( student.getFirstName() );
    }

    return result;
}
0
répondu Jonathan Payne 2016-02-02 07:19:44

Si vous utilisez comparer à la méthode de l'interface Comparable dans n'importe quelle classe. Cela peut être utilisé pour organiser la chaîne lexicographiquement.

public class Student() implements Comparable<Student>{

public int compareTo(Object obj){
if(this==obj){
    return 0;
}
if(obj!=null){
    String objName = ((Student)obj).getName();
    return this.name.comapreTo.(objName);
}
}
0
répondu VISHAL SINGH 2018-08-29 17:20:51