在使用toMap()将String列表转换为map时,我得到illigleStateExcption为什么?

时间:2018-05-31 16:36:26

标签: java

以下是示例代码,根据我的知识,建议我这里出了什么问题,每次我都传递一个新密钥,它仍然会显示重复密钥。

/\Qstring-to-search\E

3 个答案:

答案 0 :(得分:0)

一些列表元素是重复的。

因此indexOf将返回相同的值 - >抛出重复的密钥异常。

你可以做的是做一个正常的for循环:

Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < listOfCities.size(); i++) {
   map.put(i, listOfCities.get(i));
}

答案 1 :(得分:0)

您获得该异常,因为您的流中有重复的值。您可以使用IntStream生成所需的结果:

Map<Integer, String> map = IntStream.range(0, listOfCities.size())
    .mapToObj(Function.identity())
    .collect(Collectors.toMap(Function.identity(), listOfCities::get)); 

答案 2 :(得分:0)

使用简单的 for 循环将是这里的方法。如果你真的想使用Streams

IntStream.range(0, listOfCities.size())
            .collect(HashMap::new, (map, index) -> map.put(index, listOfCities.get(index)), HashMap::putAll);

这会产生

{0=Istanbul, 1=Istanbul, 2=Budapest, 3=Delhi, 4=Amsterdam, 5=Canberra, 6=Canberra}

上面创建了一个新的HashMap,我们添加了由索引键入的城市名称。最后一个组合器仅在使用并行流时适用,并用于组合多个映射。