2012-03-14 3 views
2

У меня есть ArrayList объектов (POJO), у которых есть Id и другое поле. Я выполнил переопределение equals()/hashcode() в поле POJO для поля Id. Когда я сравниваю два объекта, используя метод equals() класса Object, он отлично работает. Однако при добавлении этих объектов к ArrayList и реализацииСортировка ArrayList объектов с использованием Hashcode

Collections.sort(arrListOfObjects); 

это дает мне ClassCastException. Я поднял глаза и обнаружил, что мне нужно реализовать компаратор. Этот компаратор также делает что-то равное/hashcode override. Если это так, то почему этот код не работает? (Я знаю, что нет компаратора, но мой вопрос в том, невозможно ли реализовать сортировку на основе хэш-кода объекта?)

+0

Вы определенно хотите реализовать интерфейс Comparable. Метод compareTo() 'это то, что на самом деле определяет, что-то« больше чем »или« меньше »другого. метод 'equals()' может только сказать, что что-то «равно», что мало что делает для упорядочения. – gnomed

ответ

5

Как говорится в сообщении, вашему объекту необходимо реализовать интерфейс Comparable для сортировки. В качестве альтернативы вы можете предоставить компаратор для вашего метода sort(). Например, предполагая, что ваши объекты Strings, и вы хотите, чтобы отсортировать на основе hashcodes, вы можете сделать это:

public static void main(String[] args) { 
    List<String> list = Arrays.asList("string", "sdkj"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
    Collections.sort(list, new Comparator<String>() { 

     @Override 
     public int compare(String o1, String o2) { 
      return o1.hashCode() - o2.hashCode(); 
     } 
    }); 
    System.out.println("After Sorting"); 
    for (String s : list) { 
     System.out.println(s + "=" + s.hashCode()); 
    } 
} 
0

Компаратор не делать ничего равным или hashcode, он использует equals или hashcode, чтобы определить, что он возвращает. Он является частью документации для метода Collections.sort. Взгляните на интерфейс Comparable и реализуйте его в своем классе. Вы можете посмотреть пример SO java class implements comparable.

0

Реализация своего рода, основанный на хэш-код, конечно, возможно, но не может постоянно производить поведение желаемого. Например, рассмотрим класс Foo, метод hashCode() определен для того, чтобы всегда возвращать постоянное значение. Например:

public int hashCode() { 
    return 1; 
} 

Учитывая этот метод хэш-код в тандеме с определенным компаратор, используя этот метод, списки почти наверняка не будет отсортирован правильно, за исключением тривиальных случаев (пустой список, единый список элементов и т.д.).

В целом, хорошая вещь, о которой нужно помнить, это контракт с hashCode-equals, задокументированный в java-документе java.lang.Object.hashCode. В двух словах, возможно, столкновение hashCode может привести к неравным объектам, рендеринг сортировки, определенные на этих методах, неэффективны.

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