我有Set
个昂贵的物品。
这些对象具有ID,equals
使用这些ID进行相等。
这些物品' type有两个构造函数;一个用于昂贵的对象,另一个用于设置ID。
因此,我可以使用Set
检查特定ID是否在Set.contains(new Object(ID))
中。
但是,确定对象在集合中后,我无法获取集合中的对象实例。
如何获取该集合包含的确切对象?
答案 0 :(得分:4)
如果您想从集合中get
,您应该使用地图。
(注意大多数Set实现是Map的包装器)
Map<Key, Value> map = new ....
Value value = map.get(new Key(ID));
在你的情况下,键和值可以是相同的类型,但这通常是一个坏主意,因为键,如集合的元素,应该是不可变的。
答案 1 :(得分:4)
考虑使用UnifiedSet(以前为Eclipse Collections)中的GS Collections课程。除了Set之外,它还实现了Pool接口。 Pool为put和get添加了类似map的API。池比Map更有内存效率,因为它不为值保留内存,只保留键。
UnifiedSet<Integer> pool = UnifiedSet.newSet();
Integer integer = 1;
pool.add(integer);
Assert.assertSame(integer, pool.get(new Integer(integer)));
注意:我是Eclipse Collections的提交者。
答案 2 :(得分:2)
如果带有ID作为键的HashMap
不起作用,那么我会使用HashMap
将您的对象作为键和值。
答案 3 :(得分:1)
您可以通过以下方式获得所需内容。基本上,当您使用contains在hashset中进行搜索时,当哈希码匹配时,将调用您正在寻找的对象的equals方法。假设您正在处理自己的对象或者您可以扩展的对象,那么设置一个“信标信号”是微不足道的。 ;)具有刚刚等同的引用的类的静态字段。在这里,你可以调用contains,如果返回true,则检索对象;)
P.S。不要评判我
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 + "!";
}
}
答案 4 :(得分:0)
你可以使用来自Apache Commons Collections的FilterIterator:
Predicate eq = new EqualPredicate(new Object(ID));
FilterIterator filter = new FilterIterator(set.iterator(), eq);
Object o = (Object) filter.next();
显然,这将是一种昂贵的访问方式,但是如果您已经修复了使用Set
,则必须在某个时刻进行迭代。