我有一个 Java 对象的 ArrayList。这些对象有四个字段,我用其中两个字段来将对象视为与另一个对象相等。我正在寻找最有效的方法,给定这两个字段,以查看数组是否包含该对象。
问题在于这些类是基于 XSD 对象生成的,因此我无法修改类本身来覆盖.equals
.
除了循环并手动比较每个对象的两个字段然后在找到时中断之外,还有什么更好的方法吗?这看起来太混乱了,正在寻找更好的方法。
Edit:ArrayList 来自被解组为对象的 SOAP 响应。
这取决于您需要的效率。简单地迭代列表查找满足特定条件的元素是 O(n),但如果您可以实现 Equals 方法,ArrayList.Contains 也是如此。如果您不在循环或内部循环中执行此操作,则此方法可能就很好。
如果您确实需要不惜一切代价获得非常高效的查找速度,则需要做两件事:
- 解决班级的事实
生成:编写一个适配器类,其中
可以包装生成的类并且
哪个实施equals() http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#equals(java.lang.Object)基于
在这两个领域(假设他们
是公开的)。别忘了还有
实施哈希码() http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode() (*)
- 用该适配器包裹每个对象并
将其放入 HashSet 中。HashSet.contains() http://docs.oracle.com/javase/7/docs/api/java/util/AbstractCollection.html#contains(java.lang.Object)有常数
访问时间,即 O(1) 而不是 O(n)。
当然,构建这个HashSet仍然有O(n)的成本。只有当构建 HashSet 的成本与您需要执行的所有 contains() 检查的总成本相比可以忽略不计时,您才会获得任何收益。尝试构建一个没有重复项的列表就是这种情况。
*
(
) Implementing hashCode() is best done by XOR'ing (^ operator) the hashCodes of the same fields you are using for the equals implementation (but multiply by 31 https://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier/299748 to reduce the chance of the XOR yielding 0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)