diff --git a/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java new file mode 100644 index 0000000000..f88404a1a4 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/main/java/com/baeldung/filetomap/FileToHashMap.java @@ -0,0 +1,83 @@ +package com.baeldung.filetomap; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class FileToHashMap { + + enum DupKeyOption { + OVERWRITE, DISCARD + } + + public static Map<String, String> byBufferedReader(String filePath, DupKeyOption dupKeyOption) { + HashMap<String, String> map = new HashMap<>(); + String line; + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + while ((line = reader.readLine()) != null) { + String[] keyValuePair = line.split(":", 2); + if (keyValuePair.length > 1) { + String key = keyValuePair[0]; + String value = keyValuePair[1]; + if (DupKeyOption.OVERWRITE == dupKeyOption) { + map.put(key, value); + } else if (DupKeyOption.DISCARD == dupKeyOption) { + map.putIfAbsent(key, value); + } + } else { + System.out.println("No Key:Value found in line, ignoring: " + line); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } + + public static Map<String, String> byStream(String filePath, DupKeyOption dupKeyOption) { + Map<String, String> map = new HashMap<>(); + try (Stream<String> lines = Files.lines(Paths.get(filePath))) { + lines.filter(line -> line.contains(":")) + .forEach(line -> { + String[] keyValuePair = line.split(":", 2); + String key = keyValuePair[0]; + String value = keyValuePair[1]; + if (DupKeyOption.OVERWRITE == dupKeyOption) { + map.put(key, value); + } else if (DupKeyOption.DISCARD == dupKeyOption) { + map.putIfAbsent(key, value); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } + + public static Map<String, List<String>> aggregateByKeys(String filePath) { + Map<String, List<String>> map = new HashMap<>(); + try (Stream<String> lines = Files.lines(Paths.get(filePath))) { + lines.filter(line -> line.contains(":")) + .forEach(line -> { + String[] keyValuePair = line.split(":", 2); + String key = keyValuePair[0]; + String value = keyValuePair[1]; + if (map.containsKey(key)) { + map.get(key).add(value); + } else { + map.put(key, Stream.of(value).collect(Collectors.toList())); + } + }); + } catch (IOException e) { + e.printStackTrace(); + } + return map; + } +} diff --git a/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java new file mode 100644 index 0000000000..c89f26de69 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/java/com/baeldung/filetomap/FileToHashMapUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung.filetomap; + +import org.junit.Before; +import org.junit.Test; + +import java.net.URISyntaxException; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FileToHashMapUnitTest { + + private String filePath; + + private static final Map<String, String> EXPECTED_MAP_DISCARD = Stream.of(new String[][]{ + {"title", "The Lord of the Rings: The Return of the King"}, + {"director", "Peter Jackson"}, + {"actor", "Sean Astin"} + }).collect(Collectors.toMap(data -> data[0], data -> data[1])); + + private static final Map<String, String> EXPECTED_MAP_OVERWRITE = Stream.of(new String[][]{ + {"title", "The Lord of the Rings: The Return of the King"}, + {"director", "Peter Jackson"}, + {"actor", "Ian McKellen"} + }).collect(Collectors.toMap(data -> data[0], data -> data[1])); + + private static final Map<String, List<String>> EXPECTED_MAP_AGGREGATE = Stream.of(new String[][]{ + {"title", "The Lord of the Rings: The Return of the King"}, + {"director", "Peter Jackson"}, + {"actor", "Sean Astin", "Ian McKellen"} + }).collect(Collectors.toMap(arr -> arr[0], arr -> Arrays.asList(Arrays.copyOfRange(arr, 1, arr.length)))); + + @Before + public void setPath() throws URISyntaxException { + if (filePath == null) { + filePath = Paths.get(ClassLoader.getSystemResource("filetomap/theLordOfRings.txt").toURI()).toString(); + } + } + + @Test + public void givenInputFile_whenInvokeByBufferedReaderPriorToJava8_shouldGetExpectedMap() { + Map<String, String> mapOverwrite = FileToHashMap.byBufferedReader(filePath, FileToHashMap.DupKeyOption.OVERWRITE); + Map<String, String> mapDiscard = FileToHashMap.byBufferedReader(filePath, FileToHashMap.DupKeyOption.DISCARD); + assertThat(mapOverwrite).isEqualTo(EXPECTED_MAP_OVERWRITE); + assertThat(mapDiscard).isEqualTo(EXPECTED_MAP_DISCARD); + } + + @Test + public void givenInputFile_whenInvokeByStream_shouldGetExpectedMap() { + Map<String, String> mapOverwrite = FileToHashMap.byStream(filePath, FileToHashMap.DupKeyOption.OVERWRITE); + Map<String, String> mapDiscard = FileToHashMap.byStream(filePath, FileToHashMap.DupKeyOption.DISCARD); + assertThat(mapOverwrite).isEqualTo(EXPECTED_MAP_OVERWRITE); + assertThat(mapDiscard).isEqualTo(EXPECTED_MAP_DISCARD); + } + + @Test + public void givenInputFile_whenInvokeAggregateByKeys_shouldGetExpectedMap() { + Map<String, List<String>> mapAgg = FileToHashMap.aggregateByKeys(filePath); + assertThat(mapAgg).isEqualTo(EXPECTED_MAP_AGGREGATE); + } +} diff --git a/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt b/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt new file mode 100644 index 0000000000..1ab069e533 --- /dev/null +++ b/core-java-modules/core-java-io-4/src/test/resources/filetomap/theLordOfRings.txt @@ -0,0 +1,6 @@ +title:The Lord of the Rings: The Return of the King +director:Peter Jackson +actor:Sean Astin +actor:Ian McKellen +Gandalf and Aragorn lead the World of Men against Sauron's +army to draw his gaze from Frodo and Sam as they approach Mount Doom with the One Ring. \ No newline at end of file