从Java Set获取项目

时间:2012-10-01 09:03:34

标签: java collections

我有Set个昂贵的物品。

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

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

因此,我可以使用Set检查特定ID是否在Set.contains(new Object(ID))中。

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

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

5 个答案:

答案 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,则必须在某个时刻进行迭代。