java - 我如何遍历 Guava multimap 以成对打印出值

标签 java iteration guava multimap

对于 Guava Multimap 中的每个键,我需要取相应的值并与它们配对,不依赖于顺序。对的唯一性不依赖于键内配对的顺序。 [A,B] = [B,A]。如果在另一个键中找到 [B,A] 对,则应将其视为另一对。我不知道如何迭代这些值,所以我可以打印出不依赖于顺序的对。我也不确定如何索引它。对于数组,我可以只使用双循环。

这是一个多图示例:

BE0004429: [DB00515, DB00951, DB01582]
BE0000059: [DB00603, DB01285]
BE0001052: [DB00366, DB00472, DB00856, DB01104, DB01149]

我想获取该数据并将其更改为这种格式。仔细看,我正在尝试获取每个键的值并进行配对。

我想获取每个键中的第一个值并将其与其他值配对。取第二个值并将其与后面的值配对。直到没有更多独特的对。

DB00515, DB00951
DB00515, DB01582
DB01582, DB00951

DB00603, DB01285

DB00366, DB00472
DB00366, DB00856
DB00366, DB01104
DB00366, DB01149
DB00472, DB00856
DB00472, DB01104
DB00472, DB01149
DB00856, DB01104
DB00856, DB01149
DB01104, DB01149

最佳答案

我在更新问题之前写了这个答案以更清楚地描述所需的行为,但是我怀疑这个答案仍然会帮助一些偶然发现这个问题的人试图理解迭代 的不同方法Multimap,所以我将这个答案留给后代。看我的other answer OP 实际在寻找什么。


假设我们从以下 Multimap 开始:

Multimap<String, Integer> map = new ImmutableSetMultimap.Builder<String, Integer>()
                                .put("one", 1)
                                .putAll("several", 1, 2, 3)
                                .putAll("many", 1, 2, 3, 4, 5)
                                .build();

我们可以通过多种方式打印它的内容,让我们试试看:

  1. 作为原始字符串:

     map.toString()
    
    {one=[1], several=[1, 2, 3], many=[1, 2, 3, 4, 5]}
    
  2. 作为键的集合 => 集合对,具有唯一键:

     for(String key : map.keySet()) {
       System.out.println(key+": "+map.get(key));
     }
    
     // OR with the asMap() view
    
     for(Entry<String,Collection<Integer> e : map.asMap().entrySet()) {
       System.out.println(e.getKey()+": "+e.getValue());
     }
    
    one: [1]
    
     several: [1, 2, 3]
     many: [1, 2, 3, 4, 5]
    
  3. 作为键 => 值对的集合,具有重复的键(如果是 ListMultimap,则可能还有值):

     for(Entry<String, Integer> e : map.entries()) {
       System.out.println(e.getKey()+": "+e.getValue());
     }
    
    one: 1
    
     several: 1
     several: 2
     several: 3
     many: 1
     many: 2
     many: 3
     many: 4
     many: 5
    
  4. 作为值的集合,不关心它们的键:

     for(Integer v : map.values()) {
       System.out.println(v);
     }
    
    1
    
     1
     2
     3
     1
     2
     3
     4
     5
    

这些是通常您使用Multimap 的方式。你说你试图“打印出不依赖于顺序的对”——我不清楚这意味着什么,但如果你说你希望选项 3 的输出是任意顺序的,你可以将您的字符串写入列表,然后将其打乱,如下所示:

List<String> pairs = new ArrayList<>();
for(Entry<String, Integer> e : map.entries()) {
  pairs.add(e.getKey()+": "+e.getValue());
}
Collections.shuffle(pairs);
for(String s : pairs) {
  System.out.println(s);
}

这会以任意顺序成对打印 Multimap 的内容。

关于java - 我如何遍历 Guava multimap 以成对打印出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483884/

相关文章:

r - 如何在 r 中处理具有超过 500 万个观测值的数据帧时加速迭代?

swift - 快速显示动态范围的循环

java - 在数组内生成随机数

java - Guava Spliter 返回一个 Collection,但我想要一个 HashMap

python - 如何迭代一组张量并将每组中的元素传递给函数?

java - Guava ImmutableMap 中的性能警告

java - 将 Ruby 映射重写为 Java 映射

java - 类似于 Guava 的 EventBus 的消息服务

java - 出现错误 java.lang.NoClassDefFoundError : org/mockito/MockitoAnnotations$Mock

java - 类型、属性、实例和值之间的关系