希望有人可以解释为什么我无法从中检索元素HashSet
.
我考虑HashSet
包含列表MyHashObjects
与他们hashCode()
和equals()
方法正确地覆盖.
我希望做的是构建一个MyHashObject
自己,并将相关的哈希码属性设置为某些值.我可以查询HashSet
使用该contains()
方法查看集合中是否存在"等效"对象.因此,即使contains()
对于2个对象返回true,它们也可能不是==
真的.
那怎么会有get()
类似的contains()
工作方法呢?
有兴趣了解这个API决定背后的想法
and*_*soj 31
如果您知道要检索的元素,那么您已经拥有了该元素.在Set
给定元素的情况下,答案的唯一问题是它是否contains()
存在.
如果要对元素进行迭代,只需使用a Set.iterator()
.
听起来你要做的就是为元素的等价类指定一个规范元素.您可以使用a Map<MyObject,MyObject>
来执行此操作.请参阅此SO问题或此问题进行讨论.
如果你真的决心找到一个元素,.equals()
你的原始元素必须使用你必须使用的约束HashSet
,我认为你已经坚持迭代它并检查equals()
自己.API不允许您通过其哈希码获取内容.所以你可以这样做:
MyObject findIfPresent(MyObject source, HashSet<MyObject> set)
{
if (set.contains(source)) {
for (MyObject obj : set) {
if (obj.equals(source))
return obj;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
蛮力和O(n)丑陋,但如果这是你需要做的......
MVM*_*MVM 10
你可以HashMap<MyHashObject,MyHashObject>
代替HashSet<MyHashObject>
.
调用ContainsKey()
你的"重建" MyHashObject
将首先hashCode()
检查集合,如果一个重复的哈希码被命中,最后 - 检查equals()
你的"重建"对原始,你可以使用它来检索原始get()
这是O(1),但缺点是你可能必须覆盖两者equals()
和hashCode()
方法.
听起来你实际上是在尝试将哈希码用作地图中的键(这是HashSets在幕后所做的).你可以通过声明明确地做到这一点HashMap<Integer, MyHashObject>
.
get
HashSets 没有,因为通常您将get
作为参数提供给方法的对象与您将返回的对象相同.
如果你知道你的元素的顺序设置,可以通过转换检索它们设置成阵列。像这样:
Set mySet = MyStorageObject.getMyStringSet();
Object[] myArr = mySet.toArray();
String value1 = myArr[0].toString();
String value2 = myArr[1].toString();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
159102 次 |
最近记录: |