【发布时间】:2015-06-06 20:50:39
【问题描述】:
假设我在 Collections 中使用 A 类型。
class A {
ThisType thisField;
ThatType thatField;
String otherField;
}
只有thisField 和thatField 与识别A 的实例相关——因此它的equals() 和随之而来的hashCode() 方法被相应地覆盖。
这样,在HashSet<A> setOfAs 中,A 的对象在其 (thisField,thatField) 值对中是唯一的。
在应用程序的某处,我需要查找Set 以获取A 的实例,如果存在,则打印其otherField--元信息。
我可以
i.) 在 setOfAs 上获取迭代器,查看每个条目的 thisField 和 thatField 值,如果它们都匹配,则打印其 otherField
ii.) 使用自映射HashMap<A,A> selfMapA,其中键和值是每个条目中的相同对象。使用 (thisField,thatField) 值对实例化 A 以查找 selfMapA 并按原样获取其匹配条目,就好像它在那里一样。
(i) 是O(n)-- 尽管它在恒定时间内找到它,但它并没有在恒定时间内得到对象。
(ii) 在恒定时间内获取对象,并且是我们在系统中一直使用的对象。但是,它使用了两倍的内存。
我正在寻找的是一个集合结构,它可以在恒定时间内获取它找到的对象条目。例如,一个带有
contains(Object) 方法返回一个 Object,如果它存在则它找到的对象,而不是像 HashSet.contains() 那样的 boolean。
这些有更好的替代品吗?有没有办法解决这个问题?
【问题讨论】:
-
也许 HashMap.get(Object key) 然后检查它返回的 null 是否是常量,我不确定
-
对于您所描述的问题,正确答案是已接受的答案,但您的设置有点奇怪。为什么不直接删除字段
otherField并使用HashMap<A, String>? -
@pbabcdefp 也可以。但是在现有系统中需要更改类型
标签: java performance collections hashset asymptotic-complexity