如何在没有强制转换的情况下迭代SetMultimap中的集合?

时间:2011-02-23 10:23:04

标签: java guava

我有SetMultimap<X> x,我需要对此地图包含的每个Set<X>执行一些操作(此时我不需要密钥)。 我可以致电x.asMap().values(),但不幸的是,此方法会返回Collection<Collection<X>>。所以当迭代这个时,我需要将每个Collection<X>投射到Set<X>

SetMultimap<X> x;
for (Collection<X> y : x.asMap().values()) {
  foo((Set<X>)y); // foo only takes a Set<X>
}

还有没有这个演员吗?当然SetMultimap的文档说明这个演员阵容是安全的,但如果根本不需要演员阵容会更好。 SortedSetMultimap会出现同样的问题。

2 个答案:

答案 0 :(得分:2)

a)您没有理由需要SetSet没有Collection指定的方法。你得到的集合是集合,但变量类型不是。使用集合,无需进行投射。

b)如果您确实需要Set,或SortedSet SortedSetMultimap,则必须迭代密钥:

SetMultimap<String,Integer> mmap = Multimaps.newSetMultimap(map, supplier);
for(String key : mmap.keySet()){
    Set<Integer> set = mmap.get(key);
}

SortedSetMultimap<String,Integer> mmap = 
    Multimaps.newSortedSetMultimap(map, supplier);
for(String key : mmap.keySet()){
    SortedSet<Integer> sortedSet = mmap.get(key);
}

答案 1 :(得分:1)

我可以想到一个更好的解决方案,但效率不高(但没有演员表)。

for (K k : x.keySet()) {
    Set<X> a = x.get(k);
}