gpt4 book ai didi

java - 将两个列表组合成 map (Java)的最佳方法是什么?

转载 作者:IT老高 更新时间:2023-10-28 20:27:40 25 4
gpt4 key购买 nike

最好使用 for (String item: list),但它只会遍历一个列表,而您需要一个显式迭代器来处理另一个列表。或者,您可以对两者都使用显式迭代器。

这是问题的一个示例,以及使用索引 for 循环的解决方案:

import java.util.*;
public class ListsToMap {
static public void main(String[] args) {
List<String> names = Arrays.asList("apple,orange,pear".split(","));
List<String> things = Arrays.asList("123,456,789".split(","));
Map<String,String> map = new LinkedHashMap<String,String>(); // ordered

for (int i=0; i<names.size(); i++) {
map.put(names.get(i), things.get(i)); // is there a clearer way?
}

System.out.println(map);
}
}

输出:

{apple=123, orange=456, pear=789}

有没有更清晰的方法?也许在某个地方的集合 API 中?

最佳答案

这个问题被问到已经有一段时间了,但这些天我偏向于:

public static <K, V> Map<K, V> zipToMap(List<K> keys, List<V> values) {
return IntStream.range(0, keys.size()).boxed()
.collect(Collectors.toMap(keys::get, values::get));
}

对于那些不熟悉流的人,它的作用是获得 IntStream从 0 到长度,然后将其装箱,使其成为 Stream<Integer>以便可以将其转换为对象,然后使用 Collectors.toMap 收集它们这需要两个供应商,其中一个生成键,另一个生成值。

这可以通过一些验证(例如要求 keys.size() 小于 values.size() ),但它作为一个简单的解决方案非常有效。

编辑:以上方法适用于任何具有恒定时间查找的东西,但如果您想要一些可以按相同顺序工作的东西(并且仍然使用这种相同的模式),您可以执行以下操作:

public static <K, V> Map<K, V> zipToMap(List<K> keys, List<V> values) {
Iterator<K> keyIter = keys.iterator();
Iterator<V> valIter = values.iterator();
return IntStream.range(0, keys.size()).boxed()
.collect(Collectors.toMap(_i -> keyIter.next(), _i -> valIter.next()));
}

输出是相同的(同样,缺少长度检查等),但时间复杂度不依赖于 get 的实现使用任何列表的方法。

关于java - 将两个列表组合成 map (Java)的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1839668/

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