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收集器不允许重复值