2017-01-18 1 views
0

J'ai utilisé un comparateur auto-défini pour initialiser treeet, ce qui en fait un min-heap. Cela fonctionne bien pour supprimer les doublons de petits nombres tels que 1, 2, 3. Mais lorsque les nombres sont grands, les doublons restent dans l'arborescence. Voici mon code:Le comparateur ne supprime pas les doublons de nombre dans TreeSet

public class Test { 
    public static void main(String[] args) { 
      Set<Integer> treeset = new TreeSet<>(new MyComparator()); 
      Integer[] array = new Integer[args.length]; 
      for (int i = 0 ; i < args.length ; i ++) { 
        array[i] = Integer.valueOf(args[i]); 
        treeset.add(array[i]); 
      } 
      for (Integer i : treeset) { 
        System.out.print(i + " "); 
      } 
    } 

    public static class MyComparator implements Comparator<Integer> { 
      @Override 
      public int compare(Integer i1, Integer i2) { 
        if (i1 < i2) { 
          return -1; 
        } else if (i1 == i2) { 
          return 0; 
        } else { 
          return 1; 
        } 
      } 
    } 

}

Si je fais test java -2147483647 -2147483647 1 1, je reçois -2147483647 -2147483647 1. Il semble que quelque chose ne va pas avec mon comparateur. J'ai essayé de déboguer. Lorsque -2147483647 et -2147483647 sont comparés, au lieu de renvoyer 0, la méthode de comparaison renvoie 1. Est-ce que quelqu'un pourrait me dire pourquoi? Merci d'avance!

Répondre

1

Vous comparez des instances de Integer avec ==, mais ==, appliqué à des objets, ne compare que si elles sont la même instance. Dans votre cas, i1 et i2 sont deux instances distinctes malgré avoir la même valeur.

Utilisez la méthode equals pour comparer le contenu comme dans:

... 
       } else if (i1,equals(i2)) { 
         return 0; 
... 

Pourquoi faut-il travailler avec un petit nombre: petits entiers (-128 à 127 par défaut) sont mises en cache par la classe Integer pour éviter d'avoir à créer une nouvelle instance chaque fois que cela est nécessaire. Détails: Integer.valueOf(int)

+0

J'ai changé pour égaler(), cela a fonctionné! Je vous remercie! –

0

Lorsque vous créez un Integer en utilisant valueOf() les valeurs de -128 à 127 sont mises en cache. Cela signifie que pour cette plage de valeurs, en utilisant l'opérateur == pour la comparaison retournera true si les deux objets ont la même valeur entière. Pour les valeurs entières inférieures à -128 et supérieures à 127 qui ne fonctionneront pas, la comparaison renverra false pour les objets ayant la même valeur. Donc, utilisez la méthode equals() pour la comparaison au lieu de == si vous voulez que cela fonctionne correctement tout le temps.

+0

explication génial! Je vous remercie! –