Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何按插入顺序迭代多重映射?_Java_Guava - Fatal编程技术网

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 asMap()
    返回键及其关联项,因此您可以对(Map.Entry:asMap().entrySet())执行
    以迭代键及其关联集合
  • 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]