6

我有一个Set昂贵的对象。

这些对象具有 ID,并且equals使用这些 ID 来实现相等性。

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

所以我可以检查一个特定的 ID 是否在Setusing 中Set.contains(new Object(ID))

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

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

4

5 回答 5

5

考虑使用Eclipse CollectionsUnifiedSet中的类。除了实现接口之外,它还实现了. 为 put 和 get添加了类似的 API。内存效率更高,因为它不为值保留内存,只为键保留。PoolSetPoolMapPoolMap

UnifiedSet<Integer> pool = UnifiedSet.newSet();

Integer integer = 1;
pool.add(integer);

Assert.assertSame(integer, pool.get(new Integer(integer)));

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

于 2012-10-01T20:19:00.400 回答
4

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

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

Map<Key, Value> map = new ....

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

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

于 2012-10-01T09:06:41.763 回答
2

如果HashMap使用 id 作为键不起作用,那么我会使用HashMap你的对象作为键和值。

于 2012-10-01T09:06:35.583 回答
1

这是你可以做的一个技巧来得到你想要的东西。基本上,当您使用 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 + "!";
        }
    }
于 2014-04-07T02:15:21.040 回答
0

可以使用 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,则必须在某个时候对其进行迭代。

于 2012-10-01T09:07:56.677 回答