littlemisschik
littlemisschik

Reputation: 139

Comparing two text files in random order with Java

I am trying to compare two text files that are randomized and print out the lines that match in both of the files. File 1:

Student1
Student2
Student3
Student4

File 2:

Student6
Student1
Student2

I want the output as

Student1
Student2

My code is below.

public static void main(String[] args) throws IOException {

     String first = "file1.txt";
     String second = "file2.txt";
     BufferedReader fBr = new BufferedReader(new FileReader(first));
     BufferedReader sBr = new BufferedReader(new FileReader(second));   




     PrintWriter writer = new PrintWriter("test.txt", "UTF-8");  
     while ((first = fBr.readLine()) != null) {
         String partOne1 = fBr.readLine();
         String partTwo1 = sBr.readLine();
         while ((second = sBr.readLine()) != null) {
                System.out.println(first);
                writer.println(first);  
                break;                   

         }
     }


     writer.close();
     fBr.close();
     sBr.close(); 

Upvotes: 4

Views: 3116

Answers (5)

Nithesh Gowda
Nithesh Gowda

Reputation: 19

Here is sample code it will print matching values and also non matching values in 2 lists

private static void getMatchAndDiff(List<String> list1, List<String> list2) {
    List<String> tempList2=new ArrayList<>(list2);
    List<String> tempList1=new ArrayList<>(list1);
    list1.retainAll(list2);
    System.out.println("Matching results: ");
    list1.forEach(System.out::println);
    System.out.println("Non Matching results: ");
    tempList2.removeAll(list1);
    tempList1.removeAll(list2);
    System.out.println(tempList1+"\n"+tempList2);
  
}

Upvotes: 0

Has QUIT--Anony-Mousse
Has QUIT--Anony-Mousse

Reputation: 77485

If you want an elegant solution:

  1. Sort both
  2. Compare as sorted lists

First of all, this is very simple. Secondly, sorting is so incredibly well optimized, this will usually be faster than anything manually written, and yield elegant and easy to understand code.

Most of the other solutions here are O(n*m). This approach is O(n log n + m log m) with small constants. You could use a hashmap for lookups, which would theoretically yield O(n + m) but may have too large constants.

Upvotes: 0

Addis
Addis

Reputation: 2530

Another alternative is to put both your files in two arraylists and use the arraylist's retainAll() method to get the common files. And do the operations on it like printing or something else.

public static void main(String[] args) throws IOException {
     String first = "file1.txt";
     String second = "file2.txt";
     BufferedReader fBr = new BufferedReader(new FileReader(first));
     BufferedReader sBr = new BufferedReader(new FileReader(second));   

     List<String> firstFile = new ArrayList<>();
     List<String> secondFile = new ArrayList<>();

     PrintWriter writer = new PrintWriter("test.txt", "UTF-8");  
     while ((first = fBr.readLine()) != null) {
         firstFile.add(first);
     }
     while ((second = sBr.readLine()) != null) {
         secondFile.add(second);                  
     }

     List<String> commonFile = new ArrayList<>(firstFile);
     commonFile.retainAll(secondFile);
     System.out.println(commonFile);

     writer.close();
     fBr.close();
     sBr.close(); 
}

Upvotes: 2

Ramachandran.A.G
Ramachandran.A.G

Reputation: 4948

If you are using Java8 , the following is a terse way of achieving this logic. Please note that this is applicable for Java8 only. It uses some lambda expressions and features available without a lot of boilerplate code. Hope you find it amusing atleast

List<String> file1Lines = Files.readAllLines(Paths.get("C:\\DevelopmentTools\\student-file1.txt"), Charset.defaultCharset());
List<String> file2Lines = Files.readAllLines(Paths.get("C:\\DevelopmentTools\\student-file2.txt"), Charset.defaultCharset());

List<String> matchingStrings = file1Lines.stream().
filter(studentInfo -> file2Lines.contains(studentInfo))
                    .collect(Collectors.toList());
matchingStrings.forEach(System.out::println);

Prints :

Student1 , Student2

Upvotes: 1

Geisterkirche
Geisterkirche

Reputation: 76

It's quite simple=) Try to store all results from first file and compare with all lines from second. It will be like this:

package com.company;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Main {

    public static void main(String[] args) throws IOException {

        String first = "file1.txt";
        String second = "file2.txt";
        BufferedReader fBr = new BufferedReader(new FileReader(first));
        BufferedReader sBr = new BufferedReader(new FileReader(second));

        ArrayList<String> strings = new ArrayList<String>();

        while ((first = fBr.readLine()) != null) {
            strings.add(first);
        }
        fBr.close();

        while ((second = sBr.readLine()) != null) {
            if (strings.contains(second)) {
                System.out.println(second);
            }
        }
        sBr.close();
    }
}

It's better to use memory when possible, your 'while' inside different while can work too long time and obfuskate logic.

Upvotes: 6

Related Questions