Java将键/值字符串列表转换为Map

时间:2016-03-18 14:45:06

标签: java list

我有List个字符串,实际上是键和值:"key1", "value1", "key2", "value2", ...(每个奇数项都是键,每个偶数值)。如何以美丽的方式将其Map转换为"key1" -> "value1", "key2" -> "value2", ...

5 个答案:

答案 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());
}