2010-09-20 20 views
18

Je peux l'utiliser pour trier par IDemp mais je ne suis pas sûr s'il est possible de comparer les chaînes. J'obtiens une erreur l'opérateur n'est pas défini pour les chaînes.Comment utiliser le Comparable CompareTo sur les chaînes en Java

public int compareTo(Emp i) { 
      if (this.getName() == ((Emp) i).getName()) 
       return 0; 
      else if ((this.getName()) > ((Emp) i).getName()) 
       return 1; 
      else 
       return -1; 
+8

Curieux, pourquoi avez-vous besoin de lancer '' I' à Emp' lorsque vous avez déjà déclaré à être 'Emp' dans la signature de méthode? – BoltClock

Répondre

44

Ce que vous devez utiliser est la méthode compareTo() de chaînes.

return this.getName().compareTo(i.getName()); 

Cela devrait faire ce que vous voulez.

Habituellement, lors de la mise en œuvre de l'interface Comparable, vous allez simplement agréger les résultats de l'utilisation d'autres membres Comparable de la classe.

Voici une mise en œuvre assez typique d'une méthode compareTo():

class Car implements Comparable<Car> { 
    int year; 
    String make, model; 
    public int compareTo(Car other) { 
     if (!this.make.equalsIgnoreCase(other.make)) 
      return this.make.compareTo(other.make); 
     if (!this.model.equalsIgnoreCase(other.model)) 
      return this.model.compareTo(other.model); 
     return this.year - other.year; 
    } 
} 
+0

Aucune conversion requise. L'argument compareTo est le type générique – Gopi

+0

lorsque je remplace "else if ((this.getName())> ((Emp) i) .getName())" avec "else if (this.getName(). compareTo (((Emp) i) .getName()> 0) ", j'obtiens une erreur similaire disant operator> est undefine pour type String, int – Jack

+0

même sans lancer – Jack

1

Ne devrait pas

if (this.getName() == ((Emp) i).getName())

être

if (this.getName().equals(i.getName()))

+1

Comme indiqué par d'autres, 'getName(). compareTo (i.getName());' est une meilleure option de toute façon. – zengr

2

Vous n'avez pas besoin jeté à Emp, il est déjà un emp:

public int compareTo(Emp i) { 
    return getName().compareTo(i.getName()); 
} 
3

Java String implémente déjà Comparable. Donc, vous pouvez simplement écrire votre méthode comme

public int compareTo(Emp emp) { 
    return this.getName().compareTo(emp.getName()); 
} 

(assurez-vous d'ajouter ofcourse appropriés tels que les validations des contrôles null etc)

également dans votre code, ne pas essayer de comparer les chaînes en utilisant « == ». Utilisez la méthode 'equals' à la place. '==' ne compare que les références de chaînes tandis que equals compare sémantiquement deux chaînes.

6

Jolie que votre code peut juste être écrit comme ceci:

public int compareTo(Emp other) 
{ 
    return this.getName().compareTo(other.getName()); 
} 
+0

Oh je vois, je dois avoir été confus en passant de la comparaison ints et chaîne et utilisé> signe. Merci!! – Jack