Добавление объекта в HashSet - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь добавить Object (Exception) к Set, однако он добавляет каждое исключение, хотя некоторые являются дубликатами. debug

В моем случае дубликаты - это исключения, которые содержат одно и то же сообщение Detail.

Как правильно добавить Exceptions к HashSet только , если Exception.getDetails() еще не существует?

Есть ли другой подход, чем HashSet?

Производительность является критерием здесь, квадратичные решения (O(n^2)) не вариант.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Вам необходимо переопределить equals и hashCode методы.

Если detail является String, вы можете переопределить их следующим образом

public boolean equals(Object obj) {
   if (!(obj instanceof YourException)) {
     return false;
   } 
   return getDetail().equals(((YourException) obj).getDetail());
}

public int hashCode() {
   return getDetail().hashCode();
}

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

После переопределения равно и вставка хэш-кода YourException в TreeSet - это операция, выполняемая в O (log (n)) где n - размер набора, от javadoc :

Эта реализация обеспечивает гарантированные затраты времени журнала (n) для основных операций ( добавить , удалить и содержать).

0 голосов
/ 06 июня 2018

У вас есть несколько вариантов:

  • переопределить hashcode и equals в вашем классе исключений
  • использовать TreeSet с пользовательским Comparator
  • используйте Map<String, Exception>, где ключом является результат getDetails() (например, HashMap)
0 голосов
/ 06 июня 2018

Вам нужно переопределить, как сравниваются исключения, чтобы он распознавал дубликаты так, как вы хотите.Вы не можете сделать это для HashSet, но вы можете сделать это для TreeSet, например

Set<Exception> exceptions = new TreeSet<>(Comparator.comparing(Object::toString));

В этом примере сравнивается toString, который является типом исключения и сообщением в большинстве случаев.

Если вына самом деле вы хотите использовать HashSet, вам нужно обернуть Exception в класс, который реализует hashCode и соответствует желаемому.

Если все, что вас волнует, это тип и сообщение, вы можете хранить только toString каждого исключения

final Set<String> exceptions = new HashSet<>();

public void addException(Exception e) {
    exceptions.add(e.toString());
}
...