Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
55d29ff
[Refactor] Fix on Assignment 05
mikeleo03 Jun 24, 2024
77f0bea
[Refactor] Fix on Assignment 06
mikeleo03 Jun 24, 2024
05d249e
Merge pull request #1 from affandyfandy/Week_02
mikeleo03 Jul 8, 2024
f03e872
[Init] Initialize Lecture 11 project
mikeleo03 Jul 16, 2024
3ad2065
[Feat] All the datas (model, repo, and composite keys)
mikeleo03 Jul 16, 2024
c21f940
[Feat] Service implementation
mikeleo03 Jul 16, 2024
0036d7b
[Feat] Lombok all args constructor
mikeleo03 Jul 17, 2024
ed3347f
[Feat] Implementation of REST APIs service
mikeleo03 Jul 17, 2024
272817f
[Feat] Code resctructure (unfinished)
mikeleo03 Jul 17, 2024
cbfc073
[Fix] Update identifier for composite keys
mikeleo03 Jul 17, 2024
0a4ca11
[Refactor] Update controller to handle mapping
mikeleo03 Jul 17, 2024
9640289
[Refactor] Update the services to exclude all
mikeleo03 Jul 17, 2024
b7173c6
[Refactor] Updating to set out the class ref
mikeleo03 Jul 17, 2024
9da6d2b
[Refactor] Separated save and edit on services
mikeleo03 Jul 17, 2024
765fdad
[Refactor] Separated save and edit on controllers
mikeleo03 Jul 17, 2024
989e2f6
[Refactor] Some adjustments on department and employee controller
mikeleo03 Jul 17, 2024
2e0455d
[Refactor] Update salary and title controller new instance handle
mikeleo03 Jul 17, 2024
557185f
[Feat] Update README.md
mikeleo03 Jul 17, 2024
bf5c101
[Feat] List of Endpoints
mikeleo03 Jul 17, 2024
65d3adc
[Feat] Insert research over composite key in JPA
mikeleo03 Jul 17, 2024
b938149
[Refactor] Implementation of hash check using lombok
mikeleo03 Jul 17, 2024
8423bb5
[Init] Migrating task from Lecture 11
mikeleo03 Jul 18, 2024
60cc25c
[Feat] Implementation of dynamic search queries
mikeleo03 Jul 18, 2024
fc43715
[Feat] Explanation on dynamic search queries
mikeleo03 Jul 18, 2024
8462791
[Feat] Explanation on dynamic search queries
mikeleo03 Jul 18, 2024
734f43f
[Feat] add "/"
mikeleo03 Jul 18, 2024
333aa6e
[Feat] Implementation of Bonus
mikeleo03 Jul 18, 2024
dd2c92f
[Feat] README and postman documentation
mikeleo03 Jul 18, 2024
c95778c
[Refactor] Update README.md
mikeleo03 Jul 18, 2024
16affc4
[Feat] Page serialization + SQL logging
mikeleo03 Jul 19, 2024
0f8f353
[Feat] SQL hibernate logging
mikeleo03 Jul 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
target
target
HELP.md
14 changes: 9 additions & 5 deletions Week 02/Lecture 03/Assignment 05/ListToMap.java
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -46,11 +46,15 @@ public static void main(String[] args) {
new Employee(3, "Charlie", "Finance")
);

// Convert List to Map using employeeID as key
Map<Integer, Employee> employeeMap = employees.stream()
.collect(Collectors.toMap(Employee::getEmployeeID, emp -> emp));
// Creating employeeMap using TreeMap
Map<Integer, String> 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));
}
}
14 changes: 12 additions & 2 deletions Week 02/Lecture 03/Assignment 05/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 <inputFile> <outputFile> <keyFieldIndex>
```

for example.
```bash
java RemoveDuplicates data/input.csv data/output.csv 0
```

<br>

### 🖨️ Task 4 - Get a Shallow Copy of a `HashMap`
Expand Down Expand Up @@ -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)

Expand Down
70 changes: 56 additions & 14 deletions Week 02/Lecture 03/Assignment 05/RemoveDuplicates.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 <inputFile> <outputFile> <keyFieldIndex>");
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<String> 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
Expand All @@ -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<String> 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]);
}
}
Binary file modified Week 02/Lecture 03/Assignment 05/img/Task5.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 16 additions & 5 deletions Week 02/Lecture 04/Assignment 06/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>` 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.
Expand Down
65 changes: 37 additions & 28 deletions Week 02/Lecture 04/Assignment 06/RemoveDuplicatesCSV.java
Original file line number Diff line number Diff line change
@@ -1,46 +1,55 @@
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) {
String inputFilePath = "data/data.csv";
String outputFilePath = "data/unique.csv";
String keyFieldName = "id";

try (BufferedReader reader = Files.newBufferedReader(Paths.get(inputFilePath))) {
List<String> 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<String> 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<String> 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<String> 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);
}
}
}
}
Loading