我有一个Set
昂贵的对象。
这些对象具有 ID,并且equals
使用这些 ID 来实现相等性。
这些对象的类型有两个构造函数;一个用于昂贵的对象,另一个用于设置 ID。
所以我可以检查一个特定的 ID 是否在Set
using 中Set.contains(new Object(ID))
。
但是,确定对象在集合中后,我无法获取集合中的对象实例。
如何获得集合包含的确切对象?
我有一个Set
昂贵的对象。
这些对象具有 ID,并且equals
使用这些 ID 来实现相等性。
这些对象的类型有两个构造函数;一个用于昂贵的对象,另一个用于设置 ID。
所以我可以检查一个特定的 ID 是否在Set
using 中Set.contains(new Object(ID))
。
但是,确定对象在集合中后,我无法获取集合中的对象实例。
如何获得集合包含的确切对象?
考虑使用Eclipse CollectionsUnifiedSet
中的类。除了实现接口之外,它还实现了. 为 put 和 get添加了类似的 API。内存效率更高,因为它不为值保留内存,只为键保留。Pool
Set
Pool
Map
Pool
Map
UnifiedSet<Integer> pool = UnifiedSet.newSet();
Integer integer = 1;
pool.add(integer);
Assert.assertSame(integer, pool.get(new Integer(integer)));
注意:我是 Eclipse Collections 的提交者。
如果你想get
从一个集合中,你应该使用一个地图。
(请注意,大多数 Set 实现都是 Map 的包装器)
Map<Key, Value> map = new ....
Value value = map.get(new Key(ID));
在您的情况下,键和值可以是相同的类型,但这通常是一个坏主意,因为键(如集合的元素)应该是不可变的。
如果HashMap
使用 id 作为键不起作用,那么我会使用HashMap
你的对象作为键和值。
这是你可以做的一个技巧来得到你想要的东西。基本上,当您使用 contains 在哈希集中进行搜索时,当哈希码匹配时,将调用您要查找的对象的 equals 方法。假设您正在处理自己的对象,或者您可以扩展的对象,那么设置一个“信标信号”是微不足道的;)类的静态字段与刚刚等同的引用。在这里,您可以调用 contains,如果返回 true,则检索对象;)
PS不要评判我
import java.util.HashSet;
import java.util.Set;
public class BecauseWhyNot {
public static void main(String[] args) {
Set<Poop> sewage = new HashSet<Poop>();
set.add(new Poop("Morning Delight"));
set.add(new Poop("Hangover Doodle"));
System.out.println("Contains Fire Drill?: "
+ set.contains(new Poop("Fire Drill")));
System.out.println("Contains Morning Delight?: "
+ set.contains(new Poop("Morning Delight")));
if (Poop.lastlySmelled != null)
System.out.println("It's you lucky day: " + Poop.lastlySmelled);
else
System.out.println("Sorry, try again ;)");
}
public static class Poop {
static Poop lastlySmelled = null;
String description;
Poop(String desc) {
description = desc;
}
@Override
public int hashCode() {
return 900913 * description.hashCode();
}
@Override
public boolean equals(Object obj) {
lastlySmelled = (Poop) this;
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Poop other = (Poop) obj;
if (description == null) {
if (other.description != null)
return false;
} else if (!description.equals(other.description))
return false;
return true;
}
public String toString() {
return "Poop: " + description + "!";
}
}
您可以使用 Apache Commons Collections 中的FilterIterator:
Predicate eq = new EqualPredicate(new Object(ID));
FilterIterator filter = new FilterIterator(set.iterator(), eq);
Object o = (Object) filter.next();
显然,这将是一种访问它的昂贵方式,但是如果您固定使用 a Set
,则必须在某个时候对其进行迭代。