将对象添加到HashSet

时间:2018-06-06 13:14:16

标签: java performance set equals hashset

我正在尝试向Object (Exception)添加Set,但是它会添加每个异常,尽管有些是重复的。 debug

在我的情况下,重复项是具有相同Detail消息的异常。

如果Exceptions已经存在,我该如何正确地将HashSet添加到Exception.getDetails()

是否有另一种方法而不是HashSet

绩效是此处的标准,二次解决方案(O(n^2))不是一种选择。

3 个答案:

答案 0 :(得分:3)

您有几个选择:

  • 在您的例外类中重写hashcodeequals
  • TreeSet与自定义Comparator
  • 一起使用
  • 使用Map<String, Exception>,其中密钥为getDetails()结果(例如,HashMap

答案 1 :(得分:1)

您需要覆盖Execptions的比较方式,以便以您希望的方式识别重复项。您不能为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());
}

答案 2 :(得分:1)

您需要重新定义equalshashCode方法。

如果detailString,您可以按照以下方式重新定义它们

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

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

将此代码视为编程的基础。例如,您必须检查空值。

重新定义equals和hashCode在YourException中插入TreeSet是在 O(log(n))中完成的操作,其中n是集合的大小,来自javadoc

  

此实施提供保证log(n)时间成本基本操作(添加,删除和包含)。