Java 8 toMap IllegalStateException重复键

时间:2015-02-27 20:28:20

标签: java java-8

我有一个文件,其中包含以下格式的数据

1
2
3

我想将其加载到地图{(1->1), (2->1), (3->1)}

这是Java 8代码,

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
                .map(line -> line.trim())
                .map(Integer::valueOf)
                .collect(Collectors.toMap(x -> x, x -> 1));

我收到以下错误

Exception in thread "main" java.lang.IllegalStateException: Duplicate key 1

如何解决此错误?

2 个答案:

答案 0 :(得分:19)

如果文件中没有重复项,代码将运行。

Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
            .map(String::trim)
            .map(Integer::valueOf)
            .collect(Collectors.toMap(x -> x, x -> 1));

如果存在重复项,请使用以下代码获取该密钥的文件中出现的总次数。

Map<Integer, Long> map1 = Files.lines(Paths.get(inputFile))
            .map(String::trim)
            .map(Integer::valueOf)
            .collect(Collectors.groupingBy(x -> x, Collectors.counting());

答案 1 :(得分:18)

如果你想将你的价值映射到1,那么pramodh的回答是好的。但是如果你不想总是映射到常数,那么使用&#34; merge-function& #34;可能有所帮助:

$('[data-toggle="tooltip"]').tooltip();  

上述代码几乎与问题中发布的代码相同。但如果它遇到Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile)) .map(line::trim()) .map(Integer::valueOf) .collect(Collectors.toMap(x -> x, x -> 1, (x1, x2) -> x1)); ,而不是抛出异常,它将通过应用第一个值通过应用合并函数来解决它。