gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:36 24 4
gpt4 key购买 nike

使用 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}Values collection to Map>会更好,这让我明白了这一点:


也许你应该使用 Table相反?

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

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]

我故意将 String 用于行键,实际上是 [1, 2, 3, ...] 整数(就像您在问题中所做的那样),而对于以 0 开头的列键([0, 1, 2, ...]) 以显示与之前使用 List 的 get(int) 处理多图值集合的示例的相似性。

希望这会有所帮助,主要是确定您想要什么;)

附言我在这里使用 ArrayTable,因为它有比 ImmutableTable 更简洁的方式来创建行/键值的固定集合(宇宙) ,但如果不需要可变性,您应该使用它来代替一次更改 - ImmutableTable(和任何其他 Table 实现)没有 columnKeyList() 方法,但只有columnKeySet() 执行相同的操作,但对于 ArrayTable 来说速度较慢。当然还有ImmutableTable.BuilderImmutableTable.copyOf(Table) 应该被使用。

关于java - 如何按插入顺序迭代 Multimap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9756399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com