2010-10-18 3 views
0

J'ai construit un comparateur personnalisé très simple, que j'utilise avec un TreeSet afin de trier les chaînes par longueur dans ce TreeSet.Pourquoi String est égal à() retourne false (Custom Comparator impliqué)?

Je n'arrive pas à trouver la raison pour laquelle renvoie la valeur false même si les deux chaînes s1 et s2 contiennent la même valeur. Eclipse "variables vue" montre les lettres sont les mêmes dans les deux chaînes, mais le "id" est différent, je suppose que c'est pourquoi retourne égal Faux. Au fait, qu'est-ce que c'est que id=" "? Est-ce une sorte de pointeur vers les données de l'objet String?

public class MyComparator implements Comparator<String> { 
    public int compare(String s1, String s2) { 

     if(s1.length()<s2.length()) return -1;  
     else if (s1.length()>s2.length()) return 1; 
     return 0; 
     else if (s1.equals(s2)) return 0; //?? ALWAYS RETURNS FALSE 
     else if (s1.toString().equals(s2.toString()))//SAME PROBLEM HERE (test) 
     else return -1; 
    } 

    public boolean equals(String s) { 
     if (this.equals(s)) return true; 
     else return false; 
    } 
} 

Maintenant, voici où j'utilise cette Comparator personnalisée:

combinations = new TreeSet<String>(new MyComparator()); 

Je remplis des combinaisons avec plusieurs chaînes, construit avec la méthode substring().

En raison du problème mentionné précédemment, les combinaisons contiennent des doublons.

Lorsque je ne mets AUCUN Comparateur personnalisé pour ce TreeSet, il n'y a plus de duplicata (c'est ce que je veux) mais il est trié par ordre alphabétique ce qui est normal mais pas mon but.

+0

Est-ce pas votre mise en œuvre d'égal à égal() se coincer dans une récursion infinie? –

+0

pouvez-vous élaborer sur ce que vous voulez que votre comparateur fasse? Ce n'est pas clair pour moi ce que vous essayez d'accomplir. Peut-être poster quelques exemples de données de tri de sortie. –

+0

Vous pouvez également vous intéresser à l'utilisation de la méthode compareTo String. http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#compareTo(java.lang.String) EDIT: Le lien n'est pas analysé correctement à cause de ")" à la fin, mais vous pouvez trouver compareTo sur cette page. –

Répondre

2

Si ce que vous essayez de faire est de trier par longueur mais éliminer les doublons, ce qui suit devrait fonctionner.

import java.util.TreeSet; 
import java.util.Comparator; 
import java.util.Arrays; 

public class MyComparator implements Comparator<String> { 
    public int compare(String s1, String s2) { 
     int s1Length = s1.length(); 
     int s2Length = s2.length(); 
     if (s1Length == s2Length) { 
      return s1.compareTo(s2); 
     } 
     else { 
       return s1Length - s2Length; 
     } 


    } 

    public static void main(String[] args) { 
    String[] strings = {"Hello", "Hello", "longer", "1", "477727357235", "hello"}; 



    TreeSet<String> set = new TreeSet<String>(new MyComparator()); 
     set.addAll(Arrays.asList(strings)); 

     // Won't be duplicates with substrings 
     String s = "Hello World"; 
     set.add(s); 
     for (int i = 0; i <= s.length(); i++) { 
      String s1 = s.substring(0, i); 
      set.add(s1); 
     } 
     // Still won't be a duplicate, even if we make a copy of the string. 
     set.add(new String(s)); 

     System.out.println(set); 
} 
} 

Sortie: [, 1, H, He, Hel, Hell, Hello, hello, Hello , longer, Hello W, Hello Wo, Hello Wor, Hello Worl, Hello World, 477727357235]

+0

Vous avez absolument raison! Merci. Ma façon de comparer était plutôt moche par rapport à votre code. Mais de toute façon, je n'ai pas encore compris pourquoi cela ne fonctionne pas ... –

+0

Pourriez-vous nous donner quelques exemples de mots qui ne correspondent pas? J'ai essayé votre code et cela semble fonctionner. Vous n'avez pas besoin d'appeler toString sur les chaînes, car elles sont déjà des chaînes. Mais cela ne nuira à rien si vous le faites. Mais cela rend inutile votre seconde comparaison avec string.equals ... si leurs toStrings ne sont pas égaux, ils ne sont pas égaux. Et vous n'avez pas besoin de tomber, il suffit de retourner le résultat de leur égalité (comme je l'ai fait). – I82Much

+0

Je n'ai pas testé "indépendamment" ma classe buggée, mais je l'ai seulement utilisée avec des entrées String générées par une méthode de "combinaison générateur" que j'utilise pour trouver des anagrammes d'un mot. Vous pouvez obtenir plus de détails sur les exemples de chaînes à l'origine du problème en visualisant l'image que j'ai insérée dans la question initiale: http://yfrog.com/2rvariablesproblemj –

Questions connexes