我正在尝试向Object (Exception)
添加Set
,但是它会添加每个异常,尽管有些是重复的。
debug
在我的情况下,重复项是具有相同Detail
消息的异常。
如果Exceptions
已经存在,我该如何正确地将HashSet
添加到Exception.getDetails()
?
是否有另一种方法而不是HashSet
?
绩效是此处的标准,二次解决方案(O(n^2)
)不是一种选择。
答案 0 :(得分:3)
您有几个选择:
hashcode
和equals
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)
您需要重新定义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();
}
将此代码视为编程的基础。例如,您必须检查空值。
重新定义equals和hashCode在YourException
中插入TreeSet
是在 O(log(n))中完成的操作,其中n是集合的大小,来自javadoc:
此实施提供保证log(n)时间成本基本操作(添加,删除和包含)。