【问题标题】:How to iterate through google multimap如何遍历谷歌多地图
【发布时间】:2010-10-14 14:50:42
【问题描述】:

我必须遍历谷歌多地图。但是

  1. 我使用的是 jdk 1.4,无法切换到更高版本。所以我不能使用通用功能。
  2. 我的多图可以有多个键值。
  3. 可能存在当 multimap 的值本身就是 multimap 的情况

【问题讨论】:

    标签: java guava multimap


    【解决方案1】:

    Google Collections(现在的 Guava)是一个 Java 1.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()) { ... }
    

    遍历值Collections:

    for (Collection collection : multimap.asMap().values()) { ... }
    

    您还可以使用getkeySet() 中的每个键获取对应的Collection,如bwawok 所述。

    编辑:我没有想到 Java 1.4 也没有 foreach 循环,所以当然上面的每个循环都必须直接使用 Iterators 编写.

    【讨论】:

    • 不敢相信我这么愚蠢,以至于多年来我一直在创建像 HashMap<String, HashSet<String>> 这样的东西,而不是使用多地图
    【解决方案2】:

    我使用的是 Java 6,但这应该非常接近......如果我错过了 java 1.4ish 的内容,请见谅

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

    每次获取都会让您找回与该密钥匹配的所有内容。然后你可以剥掉它们,或者对它们做任何你想做的事情。

    【讨论】:

    • 我的代码有一个问题。我的 HashMultimap 可能有 HashMultimap 作为值。 get() 返回 Set。我无法再次将其转换为 HashMultimap 进行递归。
    • 你能描述一下 multimap 的 multimap 的用例吗 :) 似乎你可以重新考虑它是一个更理智的数据结构,不是吗?
    • 我正在将一个 XML 文件(很小,所以没有问题)转换成一个多图。因为一个标签里面可以有标签。所以一个multimap里面可以有multimap。
    • 有不少“快速”的 java XML 解析器。你尝试过其中任何一个吗?我想这取决于你想问 XML 什么问题,但是对于只是循环并用它做一些事情,普通的 XML 解析库似乎更容易......
    • 仅当值不可变时才使用 HashMultimap(至少在哈希码不能改变的范围内)。如果值是多图,请改为定义 ArrayListMultimap。在该多图上, get() 返回一个 List.
    【解决方案3】:

    当你使用 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);
            }
        }
    

    【讨论】:

      【解决方案4】:

      一个最小的例子是:

      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]
      

      【讨论】:

        猜你喜欢
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多