在不撤回已处理对象的情况下处理多个对象的最佳方法是什么?
What is the best method to treat multiple objects, without retreating already treated objects?
假设我想在某些更高级别的算法过程中使用某种方法 treat(Object o)
处理某些 class Object
的多个对象。在这个算法中,可能会出现相同的对象(不具有相同的地址),所以我不想处理所有这些相同的对象,只处理第一个出现的对象,忽略其他对象。
一个简单的解决方案是实现一个 ArrayList
结构来存储所有已处理的对象,命名为 treated
,并执行以下操作。
if (!treated.contains(o)){
treat(o);
treated.add(o);
}
但是,我认为 contains
方法在线性时间内运行,而使用 HashSet
而不是 ArrayList
将能够在常数时间内完成。
这是我的问题:相同的哈希码不能确保相等。换句话说,使用 HashSet treated
如下:
if (!treated.contains(o)){
treat(o);
treated.add(o);
}
可能不会处理所有不同的对象,因为某些对象 o1
可能最终具有与不同对象 o2
相同的哈希码。如果 o1
被处理,那么 o2
就不会被处理,反之亦然。
HashMap treated
与某些 equals()
一起使用是否更适合我的问题?
if (treated.containsKey(o.hashCode())){
Object o2 = treated.get(o.hashCode());
if (!o.equals(o2)){
treat(o);
}
} else {
treat(o);
treated.put(o.hashCode(), o);
}
解决此问题的推荐方法是什么?
注意:我看到过关于使用 "perfect hashcode"、 的评论,即 为每个唯一对象分配唯一值的哈希码,因此不会为不同的对象获得类似的哈希码对象。我不认为这是一个解决方案,因为(从理论上讲)我可以处理任意数量的不同对象,而哈希码是 int
类型,它有效地限制了不同哈希码的数量。
In other words, using HashSet treated
as follows [...]
might not treat all distinct objects, since some object o1 might end up having the same
hashcode as a different object o2
这是基于一个错误的假设,即 HashSet.contains
只检查哈希码。它没有 - 它使用哈希码找到相等的 候选者 ,但随后检查与 equals
的实际相等性。
来自contains
method documentation:
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that Objects.equals(o, e)
.
假设我想在某些更高级别的算法过程中使用某种方法 treat(Object o)
处理某些 class Object
的多个对象。在这个算法中,可能会出现相同的对象(不具有相同的地址),所以我不想处理所有这些相同的对象,只处理第一个出现的对象,忽略其他对象。
一个简单的解决方案是实现一个 ArrayList
结构来存储所有已处理的对象,命名为 treated
,并执行以下操作。
if (!treated.contains(o)){
treat(o);
treated.add(o);
}
但是,我认为 contains
方法在线性时间内运行,而使用 HashSet
而不是 ArrayList
将能够在常数时间内完成。
这是我的问题:相同的哈希码不能确保相等。换句话说,使用 HashSet treated
如下:
if (!treated.contains(o)){
treat(o);
treated.add(o);
}
可能不会处理所有不同的对象,因为某些对象 o1
可能最终具有与不同对象 o2
相同的哈希码。如果 o1
被处理,那么 o2
就不会被处理,反之亦然。
HashMap treated
与某些 equals()
一起使用是否更适合我的问题?
if (treated.containsKey(o.hashCode())){
Object o2 = treated.get(o.hashCode());
if (!o.equals(o2)){
treat(o);
}
} else {
treat(o);
treated.put(o.hashCode(), o);
}
解决此问题的推荐方法是什么?
注意:我看到过关于使用 "perfect hashcode"、 的评论,即 为每个唯一对象分配唯一值的哈希码,因此不会为不同的对象获得类似的哈希码对象。我不认为这是一个解决方案,因为(从理论上讲)我可以处理任意数量的不同对象,而哈希码是 int
类型,它有效地限制了不同哈希码的数量。
In other words, using
HashSet treated
as follows [...] might not treat all distinct objects, since some object o1 might end up having the same hashcode as a different object o2
这是基于一个错误的假设,即 HashSet.contains
只检查哈希码。它没有 - 它使用哈希码找到相等的 候选者 ,但随后检查与 equals
的实际相等性。
来自contains
method documentation:
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that
Objects.equals(o, e)
.