什么是处理多个对象而不撤回已处理对象的最佳方法?

施密特(J. Schmidt):

假设我想Object通过某种方法在某种高级算法的过程中处理某个类的多个对象treat(Object o)在这种算法中,可能会出现相同的对象(没有相同的地址),因此我不想对待这些相同的对象中的每个对象,只出现第一个,而忽略其他对象。

一个简单的解决方案是实现一种ArrayList结构来存储所有已处理的对象,名为treated,并执行以下操作。

if (!treated.contains(o)){
    treat(o);
    treated.add(o);
}

但是,我认为该contains方法在线性时间内运行,而使用a HashSet代替an 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);
}

对于此问题,推荐的方法是什么?

注意:我已经看到有关使用“完美哈希码”的评论,即为每个唯一对象分配唯一值的哈希码,因此无法为不同对象获得类似的哈希码。我不认为这是解决方案,因为(从理论上来说)我可以处理任意数量的不同对象,而哈希码的类型int有效地限制了不同哈希码的数量。

乔恩·斯基特(Jon Skeet):

换句话说,HashSet treated如下使用可能不会对待所有不同的对象,因为某些对象o1最终可能具有与不同的对象o2相同的哈希码

这是基于HashSet.contains仅检查哈希码的错误假设它不是-它使用哈希码来找到相等的候选者,但是然后equals像往常一样检查实际的相等性

contains方法文档中

如果此集合包含指定的元素,则返回true。更正式地讲,当且仅当此集合包含元素e这样使得返回true Objects.equals(o, e)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

处理多个对象实例的最佳方法

处理每个对象的多个选择的最佳方法

处理侦听并触发事件的元素/对象的最佳方法是什么?

在Rails表单对象中处理日期的最佳方法是什么

处理公共/中心对象的最佳方法

为了将多个对象添加到场景中,处理触摸动作的最佳方法是什么?

处理多个SKScenes的最佳方法是什么?

处理影响跨不同线程共享的对象的定时回调的最佳方法是什么?

在不同环境下处理页面对象的最佳方法是什么?

在多个对象之间共享对象实例的最佳方法是什么?

反应最佳方法来处理挂载前的空对象?

确定对象是否已更改的最佳方法是什么?

处理在R中连接的多个表的最佳方法是什么?

什么是处理多个套接字连接的最佳方法

用angular处理多个项目的最佳方法是什么?

处理:为什么此Walker对象不绘制?

Salesforce-从对象层次结构中删除多个记录和Salesforce中的错误处理的最佳方法

处理已加载内容中的对象

ObjectDisposedException:无法访问已处理的对象

为嵌套对象呈现部分不处理对象或本地对象

处理UITableView方法的对象数组

对象作为处理程序的方法

C ++处理临时对象和数组的正确方法是什么

处理在多个命名空间范围内声明的对象的最佳实践

处理Redis中多个列表的最佳方法?

处理多个状态更改的最佳方法

处理多个JavaScript检查的最佳方法

处理多个NSURL连接的最佳方法

使多个对象成为另一对象的委托的最佳方法是什么?