2017-01-18 7 views
0

Я использовал самоопределяемый компаратор для инициализации treeet, делая его мини-кучей. Он отлично работает, чтобы удалить дубликаты небольших чисел, таких как 1, 2, 3. Но когда числа большие, дубликаты остаются в деревьях. Вот мой код:Компаратор не удаляет дубликаты номеров в 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; 
        } 
      } 
    } 

}

Если я Java Test -2147483647 -2147483647 1 1, я получаю -2147483647 -2147483647 1. Похоже, что-то не так с моим компаратором. Я попытался отлаживать. Когда сравниваются -2147483647 и -2147483647, вместо того, чтобы возвращать 0, метод сравнения возвращает 1. Может ли кто-нибудь рассказать мне, почему? Заранее спасибо!

ответ

1

Вы сравниваете экземпляры Integer с ==, но ==, применяемый к объектам, сравнивается только в том случае, если они являются одним и тем же экземпляром. В вашем случае i1 и i2 представляют собой два разных экземпляра, несмотря на то же значение.

Используйте метод equals для сравнения содержания, как в:

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

Почему это работает с небольшими числами: небольшие целые числа (-128 до 127 по умолчанию) кэшируются Integer класса, чтобы избежать необходимости создавать новый экземпляр каждый раз, когда это необходимо. Детали: Integer.valueOf(int)

+0

Я изменил на equals(), это сработало! Спасибо! –

0

Когда вы создаете Integer с использованием значений valueOf() с -128 до 127, кешируются. Это означает, что для этого диапазона значений с использованием оператора == для сравнения вернется true, если оба объекта имеют одинаковое целочисленное значение. Для целых значений меньше -128 и больше 127, которые не будут работать, сравнение вернет false для объектов с одинаковым значением. Поэтому используйте метод equals() для сравнения вместо ==, если вы хотите, чтобы он работал правильно все время.

+0

удивительное объяснение! Спасибо! –

Смежные вопросы