TreeSet и функция равенства - PullRequest
       54

TreeSet и функция равенства

9 голосов
/ 07 сентября 2010

Существует объект Java bean, который реализовал функцию equals на основе определенных критериев (Критерий A). У меня есть требование идентифицировать уникальные объекты на основе других критериев (Критерий B). Поскольку функция equals использует критерии A, я не могу использовать HashSet. Поэтому я подумал об использовании TreeSet с моим пользовательским Comparator, который основан на критериях B. Мой вопрос таков: разрешено ли это делать так? Есть проблемы с этим подходом?

Спасибо.

Ответы [ 3 ]

15 голосов
/ 07 сентября 2010

Вот некоторые рекомендации от Oracle Java:

Обратите внимание, что порядок, поддерживаемый набором (независимо от того, предоставляется ли явный компаратор), должен соответствовать уравнениям, если он предназначен для правильной реализацииУстановить интерфейс.(См. Comparable или Comparator для точного определения соответствия с equals.) Это так, потому что интерфейс Set определен в терминах операции equals, но экземпляр TreeSet выполняет все сравнения ключей, используя свой метод CompareTo (или сравнение), поэтому дваключи, которые считаются равными этим методом, с точки зрения набора равны.Поведение множества корректно определено, даже если его порядок не совпадает с равенством;он просто не соблюдает общий контракт интерфейса Set.

Я думаю, что с технической точки зрения, у вас нет проблем.Но с точки зрения кодирования, читабельности и удобства сопровождения вы должны быть осторожны, потому что другие люди могут неправильно использовать или неправильно понимать, что вы делаете

1 голос
/ 28 ноября 2010

Вы можете обернуть их:

class BeanWrapper {

 ...

 public boolean equals(Object other) {
  return myBean.critB.equals(((Bean)other).critB);
 }

}

И положить их в набор вот так.

1 голос
/ 07 сентября 2010

Если вы часто выполняете поиск и редко добавляете элементы, рассмотрите возможность сохранить их в List, отсортированном по критерию B и используя Collections.binarySearch.

...