如何遍历谷歌多重映射(Google Multimap)

30
我需要遍历谷歌的 multimap,但是:
  1. 我使用的是jdk 1.4版本,无法切换到更高的版本。所以我不能使用泛型功能。
  2. 我的 multimap 可以有多个值对应一个键。
  3. 可能存在多层嵌套的情况,即 multimap 的值本身也是一个 multimap。
4个回答

57

Google Collections(现在叫做Guava)是一个Java1.5库...即使忽略Java 1.4中泛型的缺失,它可能使用了在1.5中添加的东西,使其不兼容。尽管如此,有各种方法可以遍历Multimap

通过键,在Java8中进行集合对:

multimap.asMap().forEach((key, collection) -> {...});

遍历所有值:

for (Object value : multimap.values()) { ... }

遍历所有键 (在迭代中多次出现映射到多个值的键):

for (Object key : multimap.keys()) { ... }

遍历键集:

for (Object key : multimap.keySet()) { ... }

遍历这些条目:

for (Map.Entry entry : multimap.entries()) { ... }

遍历值为Collection的集合:

for (Collection collection : multimap.asMap().values()) { ... }
你也可以使用`get`方法从`keySet()`中获取每个键对应的`Collection`,这正如bwawok所描述的那样。
编辑:我没有考虑到Java 1.4也没有foreach循环,因此上面的每个循环都必须直接使用`Iterator`来编写。

我简直不敢相信自己这么蠢,多年来一直在创建 HashMap<String, HashSet<String>> 这样的东西,而没有使用多重映射。 - ycomp

11

我使用的是Java 6,但应该很接近...如果我漏掉了什么像Java 1.4的东西,请见谅。

    Set keySet = listmultimap.keySet();
    Iterator keyIterator = keySet.iterator();
    while (keyIterator.hasNext() ) {
        String key = (String) keyIterator.next();
        List values = listmultimap.get( key );

    }

每个 get 都将获取与该键匹配的所有内容。然后您可以将它们剥离,或者按照您想要的方式进行操作。


我的代码只有一个问题。我的HashMultimap可能会作为值包含另一个HashMultimap,而get()方法返回Set类型。我无法将其再次强制转换为HashMultimap以进行递归操作。 - Amit Kumar Gupta
你能描述一下Multimap of Multimaps的使用场景吗 :) 看起来,也许你可以重新考虑它,将其变成更合理的数据结构,对吧? - bwawok
1
有相当多的“快速”Java XML解析器。你试过吗?我猜这取决于你想要问XML什么问题,但是如果只是循环遍历并对其进行操作,普通的XML解析库似乎更容易使用... - bwawok
只有在值是不可变的情况下才使用HashMultimap(至少在哈希码无法更改的程度上)。如果值是多映射,则应定义一个ArrayListMultimap <K,Multimap>。在该多映射上,get()返回一个List <Multimap>。 - Jared Levy
我建议使用正则表达式将XML解析为嵌套的多映射结构。 ;) - Nick Heiner
显示剩余2条评论

6
当您使用guava multimap时,值存储在Collection中,而不是List。
 Set<String> keys = multiMap.keySet();
    for (String keyprint : keys) {
        System.out.println("Key = " + keyprint);
        Collection<String> values = multiMap.get(keyprint);
        for(String value : values){
            System.out.println("Value= "+ value);
        }
    }

-1
一个最简单的例子如下:
public class Test {
    public static void main(String[] args) {
        ListMultimap<String, String> multimap = ArrayListMultimap.create();

        multimap.put("hello", " name");
        multimap.put("hello", " name2");
        multimap.put("world", " ocean");

        for (String firstName : multimap.keySet()) {
            List<String> lastNames = multimap.get(firstName);
            System.out.println(firstName + " " + lastNames);
        }
    }
}

以及输出:

world [ ocean]
hello [ name,  name2]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接