按类将一个Set拆分为多个Set

时间:2011-09-21 10:59:36

标签: java split set

道歉,如果这已在其他地方得到解答,但我还没有找到一个好的答案!


我有一个Set个对象需要按其基础class类型拆分为Set每个(显然这意味着初始集中的每个对象都只会出现在新Set个对象的一个中。

我目前的做法如下:

public static Map<Class,Set<Foo>> splitByClass(Set<Foo> foos) {

    // Create a map for the result
    Map<Class,Set<Foo>> FooMap = new HashMap<Class,Set<Foo>>();

    for (Foo foo: foos) {
        Class type = foo.getClass();

        // If a set for this key exists, add the item to that.
        if (FooMap.containsKey(type)) {
            FooMap.get(type).add(foo);
        } else {
            // Otherwise make a new set, add the item and the set to the map.
            Set<Foo> set = new HashSet<Foo>();
            set.add(foo);
            FooMap.put(type, set);
        }
    }        
    return FooMap;
}

我的问题:是否有更通用的方法将Set拆分为子集,基于某些评估方法,例如检查类类型?

1 个答案:

答案 0 :(得分:2)

你可以使用番石榴Multimap,它会让生活变得更简单:

Multimap<Class<? extends Foo>, Foo> mmap = HashMultimap.create();
for (Foo foo : foos) {
    mmap.put(foo.getClass(), foo);
}
return mmap;

此代码几乎与您的上述代码相同,只是您必须将返回类型更改为Multimap<Class<? extends Foo>, Foo>

这是一个适用于任何提供的接口类型的通用版本:

public static <X> Multimap<Class<X>, X> splitByClass(
    final Iterable<? extends X> implementations, final Class<X> interfaceType) {

    final Multimap<Class<X>, X> mmap = HashMultimap.create();
    for (final X implementation : implementations) {
        @SuppressWarnings("unchecked")
        // this should be safe:
        final Class<X> implementationType = (Class<X>) implementation.getClass();
        mmap.put(implementationType, implementation);
    }
    return mmap;
}