我有List
个字符串,实际上是键和值:"key1", "value1", "key2", "value2", ...
(每个奇数项都是键,每个偶数值)。如何以美丽的方式将其Map
转换为"key1" -> "value1", "key2" -> "value2", ...
?
答案 0 :(得分:7)
您可以这样做:
Iterator<String> it = list.iterator();
while(it.hasNext()) {
map.put(it.next(), it.next());
}
这比使用get(index)
方法更有效(如果列表实现不允许随机访问)
答案 1 :(得分:6)
如果您的列表具有随机访问权限,例如ArrayList
,则直接的方法是使用步骤2循环遍历列表中的元素:
public static void main(String[] args) {
List<String> list = Arrays.asList("key1", "value1", "key2", "value2");
Map<String, String> map = new HashMap<>();
for (int i = 0; i < list.size() - 1; i += 2) {
map.put(list.get(i), list.get(i + 1));
}
System.out.println(map);
}
请注意,这也正确处理列表长度不均匀的情况。它将忽略最后一个元素。例如,如果列表为"key1", "value1", "key2"
,则输出将为地图{key1=value1}
。
答案 2 :(得分:5)
这是一个相对简洁的方式:
var map = IntStream.range(0, list.size() / 2).boxed()
.collect(Collectors.toMap(i -> list.get(i * 2), i -> list.get(i * 2 + 1)));
答案 3 :(得分:4)
使用Eclipse Collections时,以下内容应该有效:
MutableList<String> list =
Lists.mutable.of("key1", "value1", "key2", "value2", "key3", "value3");
Map<String, String> map =
list.asLazy().chunk(2).toMap(Iterate::getFirst, Iterate::getLast);
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
MutableList是Eclipse Collections列表界面。如果你有一个JDK列表,以下应该可以工作:
List<String> list =
Arrays.asList("key1", "value1", "key2", "value2", "key3", "value3");
Map<String, String> map =
ListAdapter.adapt(list).asLazy().chunk(2).toMap(Iterate::getFirst, Iterate::getLast);
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
以上使用chunk
生成中间列表。代码将使用具有奇数个元素的列表成功,但生成的映射将具有一个条目,其中键和值相同。此代码适用于随机访问和非随机访问列表。
以下代码对于随机访问列表可能更有效。
MutableList<String> list =
Lists.mutable.of("key1", "value1", "key2", "value2", "key3", "value3");
MutableMap<String, String> map = Maps.mutable.empty();
IntInterval.oneToBy(list.size(), 2).each(i -> map.put(list.get(i - 1), list.get(i)));
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
注意:我是Eclipse Collections的撰稿人。
答案 4 :(得分:1)
我不确定是否有“漂亮”的方式,但这是最简单的方法:
while (!list.isEmpty()) {
map.put(list.remove() ,list.remove());
}