Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
80 changes: 80 additions & 0 deletions merge_sort/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
public class Customer implements Comparable<Customer> {
private int customerId;
private String lastName;
private String firstName;
private int contractId;
private String comment;

public Customer(int customerId, String lastName, String firstName, int contractId, String comment) {
this.customerId = customerId;
this.lastName = lastName;
this.firstName = firstName;
this.contractId = contractId;
this.comment = comment;
}

public int getCustomerId() {
return customerId;
}

public void setCustomerId(int customerId) {
this.customerId = customerId;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public int getContractId() {
return contractId;
}

public void setContractId(int contractId) {
this.contractId = contractId;
}

public String getComment() {
return comment;
}

public void setComment(String comment) {
this.comment = comment;
}

@Override
public int compareTo(Customer other) {
return Integer.compare(this.customerId, other.customerId);
}

@Override
public String toString() {
return String.format("%05d%-50s%-50s%05d%-25s",
customerId, lastName, firstName, contractId, comment);
}

public static Customer fromString(String line) {
if (line.length() < 135) {
throw new IllegalArgumentException("Invalid customer record format");
}

int customerId = Integer.parseInt(line.substring(0, 5).trim());
String lastName = line.substring(5, 55).trim();
String firstName = line.substring(55, 105).trim();
int contractId = Integer.parseInt(line.substring(105, 110).trim());
String comment = line.substring(110, 135).trim();

return new Customer(customerId, lastName, firstName, contractId, comment);
}
}
126 changes: 126 additions & 0 deletions merge_sort/MergeSortExample.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;

public class MergeSortExample {

public static void main(String[] args) {
try {
createTestData();
mergeAndDisplayFiles();
sortAndDisplayFile();
System.out.println("Done.");
} catch (IOException e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}

private static void createTestData() throws IOException {
System.out.println("Creating test data files...");

List<Customer> eastCustomers = Arrays.asList(
new Customer(1, "last-1", "first-1", 5423, "comment-1"),
new Customer(5, "last-5", "first-5", 12323, "comment-5"),
new Customer(10, "last-10", "first-10", 653, "comment-10"),
new Customer(50, "last-50", "first-50", 5050, "comment-50"),
new Customer(25, "last-25", "first-25", 7725, "comment-25"),
new Customer(75, "last-75", "first-75", 1175, "comment-75")
);

List<Customer> westCustomers = Arrays.asList(
new Customer(999, "last-999", "first-999", 1610, "comment-99"),
new Customer(3, "last-03", "first-03", 3331, "comment-03"),
new Customer(30, "last-30", "first-30", 8765, "comment-30"),
new Customer(85, "last-85", "first-85", 4567, "comment-85"),
new Customer(24, "last-24", "first-24", 247, "comment-24")
);

writeCustomersToFile(eastCustomers, "test-file-1.txt");
writeCustomersToFile(westCustomers, "test-file-2.txt");
}

private static void writeCustomersToFile(List<Customer> customers, String filename) throws IOException {
try (PrintWriter writer = new PrintWriter(new FileWriter(filename))) {
for (Customer customer : customers) {
writer.println(customer.toString());
}
}
}

private static List<Customer> readCustomersFromFile(String filename) throws IOException {
List<Customer> customers = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(filename))) {
String line;
while ((line = reader.readLine()) != null) {
if (!line.trim().isEmpty()) {
customers.add(Customer.fromString(line));
}
}
}
return customers;
}

private static void mergeAndDisplayFiles() throws IOException {
System.out.println("Merging and sorting files...");

List<Customer> mergedCustomers = mergeFiles("test-file-1.txt", "test-file-2.txt");

writeCustomersToFile(mergedCustomers, "merge-output.txt");

for (Customer customer : mergedCustomers) {
System.out.println(customer.toString());
}
}

public static List<Customer> mergeFiles(String file1, String file2) throws IOException {
List<Customer> customers1 = readCustomersFromFile(file1);
List<Customer> customers2 = readCustomersFromFile(file2);

customers1.sort(Comparator.comparing(Customer::getCustomerId));
customers2.sort(Comparator.comparing(Customer::getCustomerId));

List<Customer> merged = new ArrayList<>();
int i = 0, j = 0;

while (i < customers1.size() && j < customers2.size()) {
Customer c1 = customers1.get(i);
Customer c2 = customers2.get(j);

if (c1.getCustomerId() <= c2.getCustomerId()) {
merged.add(c1);
i++;
} else {
merged.add(c2);
j++;
}
}

while (i < customers1.size()) {
merged.add(customers1.get(i));
i++;
}

while (j < customers2.size()) {
merged.add(customers2.get(j));
j++;
}

return merged;
}

private static void sortAndDisplayFile() throws IOException {
System.out.println("Sorting merged file on descending contract id....");

List<Customer> customers = readCustomersFromFile("merge-output.txt");

customers.sort(Comparator.comparing(Customer::getContractId).reversed());

writeCustomersToFile(customers, "sorted-contract-id.txt");

for (Customer customer : customers) {
System.out.println(customer.toString());
}
}
}
101 changes: 101 additions & 0 deletions merge_sort/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# COBOL to Java Migration: Merge Sort Example

## Overview

This directory contains a Java migration of the COBOL merge sort functionality from `merge_sort_test.cbl`. The Java implementation maintains the same file-based sorting behavior as the original COBOL program.

## Files

- `merge_sort_test.cbl` - Original COBOL implementation
- `Customer.java` - Java Customer class with comparable interface
- `MergeSortExample.java` - Main Java implementation
- `README.md` - This documentation file

## COBOL Program Analysis

The original COBOL program performs these operations:

1. **Creates test data files** with customer records:
- `test-file-1.txt` (East region customers)
- `test-file-2.txt` (West region customers)

2. **Merges two pre-sorted input files** using COBOL's built-in `MERGE` statement:
- Sorts by customer ID in ascending order
- Outputs to `merge-output.txt`

3. **Sorts the merged file** using COBOL's `SORT` statement:
- Sorts by contract ID in descending order
- Outputs to `sorted-contract-id.txt`

4. **Displays results** after each operation

## Java Implementation

### Customer Class
- Implements `Comparable<Customer>` interface
- Contains fields: customerId, lastName, firstName, contractId, comment
- Provides proper toString() formatting to match COBOL output
- Includes fromString() method for file parsing

### MergeSortExample Class
- `createTestData()` - Creates the same test data as COBOL version
- `mergeFiles()` - Implements two-pointer merge algorithm
- `mergeAndDisplayFiles()` - Merges files and displays results
- `sortAndDisplayFile()` - Sorts by contract ID descending and displays results

## Validation Results

Both implementations produce identical output:

### Test Data Creation
Creates two files with customer records in the exact same format and order as the COBOL version.

### Merge Operation
Merges the two input files, sorting by customer ID in ascending order:
```
00001last-1 first-1 05423comment-1
00003last-03 first-03 03331comment-03
00005last-5 first-5 12323comment-5
...
```

### Sort Operation
Sorts the merged file by contract ID in descending order:
```
00005last-5 first-5 12323comment-5
00030last-30 first-30 08765comment-30
00025last-25 first-25 07725comment-25
...
```

## Running the Programs

### COBOL Version
```bash
cobc -x merge_sort_test.cbl -o merge_sort_test
./merge_sort_test
```

### Java Version
```bash
javac *.java
java MergeSortExample
```

## Verification

The outputs have been verified to be identical using diff comparison:
```bash
diff cobol_output.txt java_output.txt
# No differences found - outputs are identical
```

## Key Implementation Details

1. **File Format Compatibility**: The Java version uses the same fixed-width format as COBOL (135 characters per record)
2. **Merge Algorithm**: Implements proper two-pointer merge for sorted lists
3. **Sorting**: Uses Java's built-in sort with custom comparators
4. **Display Format**: Matches COBOL's exact output formatting
5. **Error Handling**: Includes proper file I/O error handling

This migration successfully preserves the exact behavior and output of the original COBOL program while providing a modern Java implementation.