Java 如何按插入顺序迭代多重映射?
使用谷歌番石榴的新系列 如何按插入顺序循环每个关键点的多重贴图 比如说Java 如何按插入顺序迭代多重映射?,java,guava,Java,Guava,使用谷歌番石榴的新系列 如何按插入顺序循环每个关键点的多重贴图 比如说 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("
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");
然后是下一个循环
"value2", "value22", "value222";
等等:
"value3", "value33", "value333";
对于在多个键上循环:
for (Object key : multimap.keys()) { ... }
您还可以在条目上循环:
for (Map.Entry entry : multimap.entries()) { ... }
您可以使用或
二者行为非常相似;一个主要区别是LinkedListMultimap
允许插入同一键值对的多个副本,而LinkedHashMultimap
只允许插入一个副本
有关更多信息,请参阅上面链接的Javadoc。我不完全清楚您所指的迭代顺序,请参阅
只返回键Set keySet()
返回键及其关联项,因此您可以对(Map.Entry:asMap().entrySet())执行Map asMap()
以迭代键及其关联集合
允许您迭代条目,但不必按键对它们进行分组Collection entries()
Multimap
实现--LinkedHashMultimap
,可能是LinkedListMultimap
,ImmutableMultimap
,我不太确定您需要什么(或具体的用例),但我会尝试猜测。其他答案建议使用Linked*Multimap或Immutable one,但要使用Multimap
获得所需的输出(如问题中所示),您必须创建一些奇特的映射(我将在后面讨论),或者创建三个临时集合,为每个键保存第一、第二和第三个值(如果您使用一种建议的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
我故意使用字符串作为行键,行键实际上是[1,2,3,…]整数(就像你在问题中所做的那样),列键以0([0,1,2,…])开头,以显示与前面使用列表的get(int)
on multimaps values'集合的示例的相似性
希望这将对您有所帮助,主要是在确定您想要什么方面;)
另外,我在这里使用
ArrayTable
,因为它创建行/键值的固定集(宇宙)的方法比其他方法更简洁,但是如果不需要可变性,您应该使用它,只需一个更改-ImmutableTable
(和任何其他表实现)没有columnKeyList()
方法,但是只有columnKeySet()
执行相同的操作,但是对于ArrayTable
来说速度较慢。当然,或者不可变。应该使用copyOf(Table)
。Hash*
集合不保留插入顺序。看起来我需要使用Table而不是multimap这是我困惑的地方,我在前面的问题中看到了这一点,但我不确定这是如何工作的?它是返回特定键的所有值还是返回与键关联的每个值?有这样一个例子吗?我最终使用了table,并对每一行进行迭代,以得到一个代表整行的映射。我不确定第一点。我尝试了一个正在运行的示例,使用两个多重映射的迭代顺序在使用键、值、条目和asMap时是相同的。@dawww:Oops,你说得对。我一定是看错了文件。我将删除该要点,谢谢。:-)
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
final ArrayTable<String, Integer, Object> table = ArrayTable.create(
ImmutableList.of("1", "2", "3"), ImmutableList.of(0, 1, 2));
table.put("1", 0, "value1");
table.put("1", 1, "value2");
table.put("1", 2, "value3");
table.put("2", 0, "value11");
table.put("2", 1, "value22");
table.put("2", 2, "value33");
table.put("3", 0, "value111");
table.put("3", 1, "value222");
table.put("3", 2, "value333");
for (final Integer columnKey : table.columnKeyList()) {
System.out.println(table.column(columnKey).values());
}
// prints:
// [value1, value11, value111]
// [value2, value22, value222]
// [value3, value33, value333]