From 55d29ff9f5e42684686119e66f73c337a0f24e2e Mon Sep 17 00:00:00 2001 From: mikeleo03 Date: Mon, 24 Jun 2024 23:49:22 +0700 Subject: [PATCH 1/2] [Refactor] Fix on Assignment 05 --- .../Lecture 03/Assignment 05/ListToMap.java | 14 ++-- Week 02/Lecture 03/Assignment 05/README.md | 14 +++- .../Assignment 05/RemoveDuplicates.java | 70 ++++++++++++++---- .../Lecture 03/Assignment 05/img/Task5.png | Bin 14919 -> 8283 bytes 4 files changed, 77 insertions(+), 21 deletions(-) diff --git a/Week 02/Lecture 03/Assignment 05/ListToMap.java b/Week 02/Lecture 03/Assignment 05/ListToMap.java index 686f587..de47030 100644 --- a/Week 02/Lecture 03/Assignment 05/ListToMap.java +++ b/Week 02/Lecture 03/Assignment 05/ListToMap.java @@ -1,7 +1,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; +import java.util.TreeMap; // Assume Employee class with fields: int employeeID, String name, String department class Employee { @@ -46,11 +46,15 @@ public static void main(String[] args) { new Employee(3, "Charlie", "Finance") ); - // Convert List to Map using employeeID as key - Map employeeMap = employees.stream() - .collect(Collectors.toMap(Employee::getEmployeeID, emp -> emp)); + // Creating employeeMap using TreeMap + Map employeesMap = new TreeMap<>(); + + // Convert List to Map + for (Employee emp : employees){ + employeesMap.put(emp.getEmployeeID(), emp.getName()); + } // Print the resulting Map - employeeMap.forEach((id, emp) -> System.out.println("Employee ID: " + id + ", Employee: " + emp)); + employeesMap.forEach((id, emp) -> System.out.println("Employee ID: " + id + ", Employee: " + emp)); } } \ No newline at end of file diff --git a/Week 02/Lecture 03/Assignment 05/README.md b/Week 02/Lecture 03/Assignment 05/README.md index 6769ca7..55b8de1 100644 --- a/Week 02/Lecture 03/Assignment 05/README.md +++ b/Week 02/Lecture 03/Assignment 05/README.md @@ -80,7 +80,7 @@ To remove duplicate lines from a file: 4. **Writing Unique Lines**: Write only those lines to a new file that haven't been seen before (not in the `HashSet`). #### 📋 Case CSV Content -In this program, i use CSV file [`input.csv`](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/data/input.csv) with content like this. +In this program, i use CSV file [`input.csv`](/Week%2002/Lecture%2003/Assignment%2005/RemoveDuplicates.java) with content like this. ```csv employeeID,name,department 1,Alice,HR @@ -106,6 +106,16 @@ Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lec The output of the program shows on this [`output.csv`](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/data/output.csv) +Here is how to run the updated code of program +```bash +$ java RemoveDuplicates +``` + +for example. +```bash +java RemoveDuplicates data/input.csv data/output.csv 0 +``` +
### 🖨️ Task 4 - Get a Shallow Copy of a `HashMap` @@ -166,7 +176,7 @@ Here i implement class `BankAccount` and `BankAccountDemo`. 3. **Use Java Streams for Transformation**: Utilize Java Streams API to transform the `List` into a `Map`. 4. **Collect into Map**: Use the `Collectors.toMap()` method to collect elements of the `List` into a `Map` using the specified key and value mappings. -Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lecture%2003/Assignment%205/ListToMap.java), and the output of the program shows like this. +Detail implementation is written on [this code](/Week%2002/Lecture%2003/Assignment%2005/ListToMap.java), and the output of the program shows like this (updated based on comment). ![Screenshot](img/Task5.png) diff --git a/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java b/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java index f364dd0..19287f7 100644 --- a/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java +++ b/Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java @@ -3,29 +3,42 @@ import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; public class RemoveDuplicates { public static void main(String[] args) { - String inputFileName = "data/input.csv"; - String outputFileName = "data/output.csv"; - String delimiter = ","; // Parse CSV format - - // Set to store unique keys (employeeID in this case) + if (args.length < 3) { + System.out.println("Usage: java RemoveDuplicates "); + return; + } + + String inputFileName = args[0]; + String outputFileName = args[1]; + int keyFieldIndex; + try { + keyFieldIndex = Integer.parseInt(args[2]); + } catch (NumberFormatException e) { + System.out.println("Invalid keyFieldIndex. It must be an integer."); + return; + } + + // Set to store unique keys Set seenKeys = new HashSet<>(); - + try (BufferedReader reader = new BufferedReader(new FileReader(inputFileName)); PrintWriter writer = new PrintWriter(new FileWriter(outputFileName))) { String line; while ((line = reader.readLine()) != null) { - // Split the line into fields - String[] fields = line.split(delimiter); - - // Ensure there are enough fields and key field is valid - if (fields.length > 1) { - String key = fields[0]; // Assuming employeeID is the first field + // Properly split the line respecting quoted commas + String[] fields = parseCsvLine(line); + + // Ensure key field index is valid + if (fields.length > keyFieldIndex) { + String key = fields[keyFieldIndex]; if (!seenKeys.contains(key)) { seenKeys.add(key); // Add the key to set (marks as seen) writer.println(line); // Write the line to output @@ -36,7 +49,36 @@ public static void main(String[] args) { System.out.println("Duplicates removed successfully. Output written to " + outputFileName); } catch (IOException e) { - System.out.println("I/O Error occured:" + e); + System.out.println("I/O Error occurred: " + e); } } -} + + // Function to parse CSV line while handling commas within quotes + private static String[] parseCsvLine(String line) { + boolean inQuotes = false; + StringBuilder field = new StringBuilder(); + List fields = new ArrayList<>(); + + for (char c : line.toCharArray()) { + switch (c) { + case '"': + inQuotes = !inQuotes; // Toggle the inQuotes flag + break; + case ',': + if (inQuotes) { + field.append(c); // Inside quotes, include comma + } else { + fields.add(field.toString()); + field.setLength(0); // Reset the field buffer + } + break; + default: + field.append(c); // Add character to field buffer + break; + } + } + fields.add(field.toString()); // Add last field + + return fields.toArray(new String[0]); + } +} \ No newline at end of file diff --git a/Week 02/Lecture 03/Assignment 05/img/Task5.png b/Week 02/Lecture 03/Assignment 05/img/Task5.png index ec754bd052f5acbafcd8bbdde0561e8ac5e71835..620f6598358a0dfb43ff00ee9ee38be7242eb3fa 100644 GIT binary patch literal 8283 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 S Date: Mon, 24 Jun 2024 23:49:28 +0700 Subject: [PATCH 2/2] [Refactor] Fix on Assignment 06 --- Week 02/Lecture 04/Assignment 06/README.md | 21 ++++-- .../Assignment 06/RemoveDuplicatesCSV.java | 65 +++++++++++-------- 2 files changed, 53 insertions(+), 33 deletions(-) diff --git a/Week 02/Lecture 04/Assignment 06/README.md b/Week 02/Lecture 04/Assignment 06/README.md index 7a36c3c..26cad3a 100644 --- a/Week 02/Lecture 04/Assignment 06/README.md +++ b/Week 02/Lecture 04/Assignment 06/README.md @@ -119,11 +119,22 @@ Here’s a detailed process on how to remove duplicate lines from files based on 4. **Write the Output**: Write the processed, duplicate-free data to a new file. #### 👨🏻‍💻 Implementation -Detail implementation is written on [this code](/Week%2002%20-%20Jun%2017-21/Lecture%2004/Assignment%206/RemoveDuplicatesCSV.java). Here’s what the program actually done. -1. **Read All Lines**: `Files.readAllLines(Paths.get(inputFilePath))` reads the CSV file into a list of strings. -2. **Extract Header**: The first line is treated as the header to determine the key field's index. -3. **Stream Processing**: The stream skips the header, then collects lines into a map using the key field (`id`). If a duplicate key is found, the first occurrence is retained. -4. **Write Results**: The header is re-added, and the list is written to the new file. +Detail implementation is written on [this code](/Week%2002/Lecture%2004/Assignment%2006/RemoveDuplicatesCSV.java). Here’s what the program actually done (updated based on comment). +1. **Initialize Readers and Writers** + - `BufferedReader` is used to read the input CSV file line by line. + - `BufferedWriter` is used to write the unique lines to the output CSV file. +2. **Extract and Write Header** + - The first line, which is the header, is read using `reader.readLine()`. + - This header is written immediately to the output file using `writer.write(header)`. +3. **Determine Key Field Index** + - The header is split to determine the index of the key field (`id`). + - This is done by iterating through the headers to find the matching field. +4. **Stream Processing and Duplicate Removal** + - A `Set` is used to keep track of the keys that have already been processed. + - For each subsequent line, the key field's value is checked against the `Set`. If the key is unique, the line is written to the output file. +5. **Read and Write Lines** + - The program continues to read each line from the input file, splits it to get the key field, and checks the key against the `Set`. + - If the key is not in the `Set`, the line is written to the output file and the key is added to the `Set`. **Best Practices Highlighted** 1. **`BufferedReader` for Large Files**: Using `BufferedReader` with `lines()` streams data efficiently. diff --git a/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java b/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java index 77d29de..01e728e 100644 --- a/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java +++ b/Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java @@ -1,10 +1,10 @@ import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; +import java.util.HashSet; +import java.util.Set; public class RemoveDuplicatesCSV { public static void main(String[] args) { @@ -12,35 +12,44 @@ public static void main(String[] args) { String outputFilePath = "data/unique.csv"; String keyFieldName = "id"; - try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputFilePath))) { - List lines = reader.lines().collect(Collectors.toList()); - if (lines.isEmpty()) return; + try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputFilePath)); + BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputFilePath))) { + + String header = reader.readLine(); + if (header == null) return; - // Extract header and determine the key field index - String header = lines.get(0); - List headers = Arrays.asList(header.split(",")); - int keyIndex = headers.indexOf(keyFieldName); - if (keyIndex == -1) throw new IllegalArgumentException("Invalid key field name"); + // Write header to the output file + writer.write(header); + writer.newLine(); - // Process lines and remove duplicates based on the key field - List uniqueLines = lines.stream() - .skip(1) // Skip header - .collect(Collectors.toMap( - line -> line.split(",")[keyIndex], // Use the key field - line -> line, // Use the line as value - (existing, replacement) -> existing // Keep the first occurrence - )) - .values() - .stream() - .collect(Collectors.toList()); + // Determine the key field index + String[] headers = header.split(","); + int keyIndex = -1; + for (int i = 0; i < headers.length; i++) { + if (headers[i].trim().equals(keyFieldName)) { + keyIndex = i; + break; + } + } + if (keyIndex == -1) throw new IllegalArgumentException("Invalid key field name"); - // Add header back to the list - uniqueLines.add(0, header); + // Use a Set to track unique keys + Set seenKeys = new HashSet<>(); - // Write the results to a new file - Files.write(Paths.get(outputFilePath), uniqueLines); + // Read and process each line + String line; + while ((line = reader.readLine()) != null) { + String[] fields = line.split(","); + if (fields.length > keyIndex) { + String key = fields[keyIndex]; + if (seenKeys.add(key)) { // Add returns false if the key was already present + writer.write(line); + writer.newLine(); + } + } + } } catch (IOException e) { - System.out.println("I/O Error occured:" + e); + System.out.println("I/O Error occurred: " + e); } } -} +} \ No newline at end of file