从Java Set获取项目

我有一套昂贵的物品。

这些对象具有ID, equals使用这些ID进行相等。

这些对象的类型有两个构造函数; 一个用于昂贵的对象,另一个用于设置ID。

所以我可以使用Set.contains(new Object(ID))检查特定ID是否在Set

但是,确定对象在集合中后,我无法获取集合中的对象实例。

如何获取该集合包含的确切对象?

考虑在Eclipse Collections (以前的GS Collections )中使用UnifiedSet类。 它除了Set之外还实现了Pool接口。 Pool为put和get添加了类似于map的API。 池比Map更有内存效率,因为它不为值保留内存,只保留键。

 UnifiedSet pool = UnifiedSet.newSet(); Integer integer = 1; pool.add(integer); Assert.assertSame(integer, pool.get(new Integer(integer))); 

注意:我是Eclipse Collections的提交者。

如果你想从一个集合中get ,你应该使用一个Map。

(注意大多数Set实现是Map的包装器)

 Map map = new .... Value value = map.get(new Key(ID)); 

在你的情况下,键和值可以是相同的类型,但这通常是一个坏主意,因为键,如集合的元素,应该是不可变的。

如果带有id作为键的HashMap不起作用,那么我将使用HashMap将您的对象作为键和值。

这是你可以做的一个黑客,以获得你想要的。 基本上,当您使用contains在hashset中进行搜索时,当哈希码匹配时,将调用您正在查找的对象的equals方法。 假设你正在处理你自己的对象,或者你可以扩展的对象,设置一个’信标信号’;)类的静态字段与刚刚等同的引用是微不足道的。 在这里,你可以调用contains,如果返回true,则检索对象;)

PS不评判我

 import java.util.HashSet; import java.util.Set; public class BecauseWhyNot { public static void main(String[] args) { Set sewage = new HashSet(); 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(); 

显然,这将是一种昂贵的访问方式,但如果您已经修复了使用Set ,则必须在某个时刻迭代它。