加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何按插入顺序迭代Multimap?

发布时间:2020-12-14 23:46:05 所属栏目:Java 来源:网络整理
导读:使用来自Google的Guava,http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained的新系列 如何按插入顺序为每个键循环遍历MultiMap? 例如 multimap = new HashMultiMapString,String();multimap.put("1","value1");multimap.put("1","v
使用来自Google的Guava,http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained的新系列

如何按插入顺序为每个键循环遍历MultiMap?

例如

multimap = new HashMultiMap<String,String>();
multimap.put("1","value1");
multimap.put("1","value2");
multimap.put("1","value3");

multimap.put("2","value11");
multimap.put("2","value22");
multimap.put("2","value33");

multimap.put("3","value111");
multimap.put("3","value222");
multimap.put("3","value333");

在我需要的每个循环上

"value1","value11","value111";

然后是下一个循环

"value2","value22","value222";

等等:

"value3","value33","value333";

解决方法

我不太确定你的需求(或具体用例),但我会猜测.其他答案建议使用Linked * Multimap或Immutable,但要使用Multimap获得所需的输出(如图所示),您将不得不创建一些花哨的Map(我将在稍后讨论)或者例如创建三个临时集合,第一个,第二个每个键的第三个值(如果您使用建议的Multimap实现之一,它们将按插入顺序排列).它最好是ListMultimaps之一,因为你可以迭代multimap.keySet()来获得索引可用值的列表:
final ListMultimap<String,String> multimap = LinkedListMultimap.create();
// put values from question here

final List<Object> firstValues = Lists.newArrayList();
for (final String key: multimap.keySet()) {
  firstValues.add(multimap.get(key).get(0));
}    
System.out.println(firstValues);
// prints [value1,value11,value111]
// similar for multimap.get(key).get(1) and so on

但缺点是你必须为你创建三个列表,例如是什么使得这个解决方案相当不灵活.所以也许将{first,second,third}值集合放到Map>会更好,这让我想到了这一点:

也许你应该使用Table而不是?

表被设计为一个集合,它将一对有序的键(称为行键和列键)与一个值相关联,而这里更重要的是具有行和列视图.我在这里使用ArrayTable

final ArrayTable<String,Integer,Object> table = ArrayTable.create(
    ImmutableList.of("1","2","3"),ImmutableList.of(0,1,2));

table.put("1","value1");
table.put("1","value2");
table.put("1",2,"value3");

table.put("2","value11");
table.put("2","value22");
table.put("2","value33");

table.put("3","value111");
table.put("3","value222");
table.put("3","value333");

for (final Integer columnKey : table.columnKeyList()) {
  System.out.println(table.column(columnKey).values());
}
// prints:
// [value1,value111]
// [value2,value22,value222]
// [value3,value33,value333]

我故意将String用于行键[1,3,…]实际上是整数(就像你在问题中所做的那样)和整数用于以0开头的列键([0,… ])使用List的get(int)在multimaps值的集合上显示与前一个示例的相似性.

希望这会有所帮助,主要是确定你想要的东西;)

附:我在这里使用ArrayTable,因为它有更简洁的方法来创建行/键值的固定集(宇宙),而不是ImmutableTable,但是如果不需要可变性,你应该使用它来改变一个 – ImmutableTable(和任何其他表实现)不没有columnKeyList()方法,但只有columnKeySet()执行相同的操作,但是对于ArrayTable来说速度较慢.当然应该使用ImmutableTable.Builder或ImmutableTable.copyOf(表).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读