我有一个字符串列表,其中实际上是键和值:"key1", "value1", "key2", "value2", ...
(每个奇数项都是键,每个偶数项都是值)。如何以优美的方式将其转换为这样的Map
:"key1" -> "value1", "key2" -> "value2", ...
?
您可以简单地执行以下操作:
Iterator<String> it = list.iterator();
while(it.hasNext()) {
map.put(it.next(), it.next());
}
如果列表实现不允许随机访问,使用此方法会比使用get(index)
方法更有效率。
以下是一个相对简洁的方法:
var map = IntStream.range(0, list.size() / 2).boxed()
.collect(Collectors.toMap(i -> list.get(i * 2), i -> list.get(i * 2 + 1)));
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}
的映射。
使用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);
我不确定是否有“美观”的方法,但这是最简单的方法:
while (!list.isEmpty()) {
map.put(list.remove() ,list.remove());
}
"key1", "value1", "key2"
,即长度为奇数,则会抛出异常。 - Tunaki