Comment puis-je écrire une méthode compareTo qui compare les objets?
Je suis en train d'apprendre sur les tableaux, et en gros j'ai un tableau qui recueille un nom, prénom, et le score.
J'ai besoin d'écrire un compareTo
méthode qui permettra de comparer le nom puis le prénom de sorte que la liste peut être triée par ordre alphabétique en commençant par les noms de famille, et puis, si deux personnes ont le même nom de famille, alors il sera de trier la première nom.
Je suis confus, parce que toutes les informations dans mon livre est celui de la comparaison des nombres, pas des objets et des Cordes.
Voici ce que j'ai codé jusqu'à présent. Je sais que c'est mal, mais au moins il explique ce que je pense je suis en train de 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 le <
et >
symboles sont mauvais, mais comme je l'ai dit mon livre vous montre seulement comment utiliser le compareTo
.
- Si vous pouviez juste de dire
someString < someOtherString
, il n'y aurait pas besoin de beaucoup pourcompareTo
...
Vous devez vous connecter pour publier un commentaire.
C'est la bonne façon de comparer des chaînes de caractères:
Ce ne sera même pas compiler:
Utilisation
if (this.getLastName().compareTo(s.getLastName()) < 0)
à la place.Donc, pour comparer poing/nom de la commande, vous devez:
La méthode compareTo est décrite comme suit:
Disons que nous aimerions comparer les Jedis par leur âge:
Alors, si notre Jedi est plus ancienne que la condition, vous devez de retour positif, si ils ont le même âge, vous retourner la valeur 0, et si notre Jedi est plus jeune que vous de retour négatif.
Par la mise en œuvre de la
compareTo
méthode (en provenance de l'Comparable
interface) votre définition de ce qui est appelé un ordre naturel. Toutes les méthodes de tri dans le JDK va utiliser cette commande par défaut.Y sont reprises dans lesquels vous pouvez baser votre comparaison à d'autres objets, et non pas sur un type primitif. Par exemple, copare Jedis en fonction de leurs noms. Dans ce cas, si les objets par rapport mettent déjà en œuvre des
Comparable
ensuite, vous pouvez faire la comparaison à l'aide de soncompareTo
méthode.Il serait plus simple dans ce cas.
Maintenant, si vous imé à utiliser à la fois le nom et l'âge comme les critères de comparaison, alors vous devez décider de votre oder de comparaison, ce qui a la priorité. Par exemple, si deux Jedis sont nommés de la même façon, alors vous pouvez utiliser leur âge afin de décider qui va d'abord et qui va au deuxième.
Si vous aviez un tableau de Jedis
Tout ce que vous avez à faire est de demander à la classe
java.util.Arrays
pour l'utilisation de sa méthode de tri.Ce
Arrays.sort
méthode de l'utilisation de voscompareTo
méthode pour trier les objets un par un.Écouter @milkplusvellocet, je vous recommandons d'implémenter l'interface Comparable à votre classe ainsi.
Seulement de contribuer aux réponses des autres:
String.compareTo()
vais vous dire comment les différentes une chaîne à partir d'un autre.par exemple
System.out.println( "Test".compareTo("Tesu") );
impression sera -1et
System.out.println( "Test".compareTo("Tesa") );
va imprimer 19et ringard et démodé d'une ligne de solution à 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 lastnames sont les mêmes ou pasthis.lastName.compareTo(s.getLastName())
si oui, puis revient en comparaison de nom de famille.this.firstName.compareTo(s.getFirstName())
si pas, renvoie la comparaison de prénom.Vous êtes presque tout le chemin là.
De votre première quelques lignes, en comparant le nom de famille, sont sur la bonne voie. Le compareTo() la méthode sur la chaîne de retour d'un nombre négatif pour une chaîne de caractères dans l'ordre alphabétique avant, et d'un nombre positif par 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, aller sur une case de votre premier nom à côté. Si le premier nom est le même, vérifier votre score suivant. (Pensez à l'imbrication de votre si/alors les blocs.)
Envisager l'utilisation de la
Comparator
interface décrite ici qui utilise les génériques de sorte que vous pouvez éviter de jeterObject
àStudent
.Eugène Retunsky dit, votre première partie est la bonne façon de comparer
String
s. Aussi, si lelastName
s sont égaux, je pense que vous vouliez comparerfirstName
s, auquel cas il suffit d'utilisercompareTo
de la même manière.if (s.compareTo(t) > 0)
allons comparer la chaîne s à la chaîne de t et de retour de l'int valeur que vous souhaitez.Maintenant reste plus qu'à tester pour un positif négatif de retour de la méthode, comme vous le feriez normalement.
Acclamations
Une Chaîne de caractères est un objet en Java.
vous pouvez comparer comme ça,
Je n'aurais pas un paramètre du type d'Objet, pas de point en le jetant à l'Étudiant si nous savons qu'il en sera toujours de type Étudiant.
Comme pour une explication, "result == 0" ne se produire lorsque les noms sont identiques, à quel point nous comparons les noms de la première et de renvoyer cette valeur à la place.
Si vous aide à comparer À la méthode de l'interface Comparable quelle que soit la classe.
Cela peut être utilisé pour organiser la chaîne dans Lexicographiquement.