Java 使用toMap()将字符串列表转换为映射时,我得到了illegleStateException为什么?

Java 使用toMap()将字符串列表转换为映射时,我得到了illegleStateException为什么?,java,Java,下面是示例代码,根据我的知识,建议我这里出了什么问题,我每次都传递一个新密钥,但它仍然显示为重复密钥 public class CollectorsDemo5 { public static void main(String[] args) { List<String> listOfCities=new ArrayList<String>(); listOfCities.add("Istanbul"); lis

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

public class CollectorsDemo5 {

    public static void main(String[] args) {

        List<String> listOfCities=new ArrayList<String>();

        listOfCities.add("Istanbul");
        listOfCities.add("Istanbul");
        listOfCities.add("Budapest");
        listOfCities.add("Delhi");
        listOfCities.add("Amsterdam");
        listOfCities.add("Canberra");
        listOfCities.add("Canberra");

        Map<Integer, String> map = listOfCities.stream()
            .collect(Collectors.toMap(listOfCities::indexOf, Function.identity()));

        map.forEach((k,v)->System.out.println("key:"+k +"  value:"+v)); 
    }
}
公共类收集器演示5{
公共静态void main(字符串[]args){
List listOfCities=new ArrayList();
添加(“伊斯坦布尔”);
添加(“伊斯坦布尔”);
添加(“布达佩斯”);
添加(“德里”);
添加(“阿姆斯特丹”);
添加(“堪培拉”);
添加(“堪培拉”);
Map Map=listOfCities.stream()
.collect(Collectors.toMap(listOfCities::indexOf,Function.identity());
map.forEach((k,v)->System.out.println(“键:+k+”值:+v));
}
}

某些列表元素重复

因此,
indexOf
将返回相同的值->抛出重复键异常

您可以为循环执行正常的

Map<Integer, String> map = new HashMap<>();
for (int i = 0; i < listOfCities.size(); i++) {
   map.put(i, listOfCities.get(i));
}
Map Map=newhashmap();
对于(int i=0;i
由于流中存在重复的值,因此会出现该异常。您可以使用
IntStream
生成所需的结果:

Map<Integer, String> map = IntStream.range(0, listOfCities.size())
    .mapToObj(Function.identity())
    .collect(Collectors.toMap(Function.identity(), listOfCities::get)); 
Map Map=IntStream.range(0,listOfCities.size())
.mapToObj(Function.identity())
.collect(Collectors.toMap(Function.identity(),listOfCities::get));
使用简单的for循环将是实现这一点的方法。如果你真的想使用流

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
,我们将索引键入的城市名称添加到其中。最后一个组合器仅在使用并行流时适用,用于组合多个贴图。

列表中有重复项。为
伊斯坦布尔
调用indexOf将始终只返回0。您还可以使用带有合并函数的
toMap()
版本来解决您的问题,该版本允许您明确决定如何处理重复项。我知道我可以通过使用合并函数来解决这个问题。但我要问的是,我将列表的索引作为键传递,因此每次它都是唯一的(根据我的假设),而值都是重复的。为什么?这是一种方法,但我认为更直接的解决方案是简单地为
toMap()
收集器提供一个合并函数。@BrianGoetz AFAIU,在合并函数中,您能做的最好的事情是选择其中一个(或concat或类似的东西),但无论您做什么,它都是针对特定的键(这里的索引)。但我猜OP的目的是构建一个包含索引键控值的映射。谢谢,user7我认为你的答案可能是解决我问题的好办法流中不允许重复值吗?或者映射不能接受重复的值?不过,我要感谢您的努力。@saroj收集器不允许重复值