【发布时间】:2020-03-02 17:39:26
【问题描述】:
我将int[] 转换为List<Integer>。手头的任务是将集合中的每个元素映射到 0。所以我想将这个 List 转换为 Set,然后映射到 0。
所以对于一个集合1, 3, 7, 4, 8,它应该看起来像:(1, 0), (3, 0), (7, 0), (4, 0), (8, 0)。为此,我尝试过:
Map<Integer, Integer> map = Arrays.stream(elements)
.boxed()
.collect(Collectors.toMap(x -> x, x -> 0));
但是在尝试这个时,我得到了这个错误:
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 0
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133)
at java.util.HashMap.merge(HashMap.java:1254)
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320)
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
at java.util.stream.IntPipeline$4$1.accept(IntPipeline.java:250)
at java.util.Spliterators$IntArraySpliterator.forEachRemaining(Spliterators.java:1032)
at java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:693)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
at DeleteElementsByOccurence.main(DeleteElementsByOccurence.java:18) <-- Refers to the Collectors.toMap line
我知道这些东西在 Scala 中非常简单,但我无法弄清楚在 Java 中执行的逻辑。
【问题讨论】:
-
它实际上是一个集合吗?您的代码暗示了一个元素数组,这不是一个集合。检查数组中是否存在重复元素。
-
我的错,这是一个列表
-
如果列表中有重复的数字应该怎么办?是
[1,1,2] -> [(1,0), (1,0), (2,0)]还是[1,1,2] -> [(1,0), (2,0)]? -
如果你有
List,你不应该使用Arrays.stream。你真的有int[]吗? -
@Sparker0i,然后是
.distinct(),或者先制作一个集合,然后流式传输该集合。大多数可行的方法已经有了答案。请注意,.distinct()在后台也有一个集合,而带有三个 lambda 的toMap不会创建一个集合,最终仍然可以按照您的预期工作。
标签: java collections java-8 java-stream