Java 8 toMap Illegalstateexception Duplicate Key
I Have a File Which Contains Data in the Following Format 1 2 3 I Want to Load This to Map as {(1->1), (2->1), (3->1)} This Is the Java 8 Code, Map Map1 =...
I have a file which contains data in the following format
1
2
3
I want to load this to map as {(1->1), (2->1), (3->1)}
This is the Java 8 code,
Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
.map(line -> line.trim())
.map(Integer::valueOf)
.collect(Collectors.toMap(x -> x, x -> 1));
I am getting the following error
Exception in thread "main" java.lang.IllegalStateException: Duplicate key 1
How do I fix this error?
2 Answers
The pramodh's answer is good if you want to map your value to 1. But in case you don't want to always map to a constant, the use of the "merge-function" might help:
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));
The above code is almost the same as posted in the question. But if it encounters a duplicate key, instead of throwing an exception, it will solve it by applying the merge function, by taking the first value.
The code will run if there are no duplicates in the file.
Map<Integer, Integer> map1 = Files.lines(Paths.get(inputFile))
.map(String::trim)
.map(Integer::valueOf)
.collect(Collectors.toMap(x -> x, x -> 1));
If there are duplicates use the following code to get the total number of occurrences in the file for that key.
Map<Integer, Long> map1 = Files.lines(Paths.get(inputFile))
.map(String::trim)
.map(Integer::valueOf)
.collect(Collectors.groupingBy(x -> x, Collectors.counting());