用Java随机比较两个文本文件

6rvt4ljy  于 2023-02-02  发布在  Java
关注(0)|答案(5)|浏览(122)

我尝试比较两个随机化的文本文件,并打印出两个文件中匹配的行。文件1:

Student1
Student2
Student3
Student4

档案二:

Student6
Student1
Student2

我希望输出为

Student1
Student2

我的代码如下。

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();
5f0d552i

5f0d552i1#

这很简单=)尝试存储第一个文件的所有结果,并与第二个文件的所有行进行比较。

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();
    }
}

最好尽可能使用内存,不同while中的“while”可能会工作太长时间并混淆逻辑。

brjng4g3

brjng4g32#

另一种方法是将两个文件放在两个arraylist中,使用arraylist的retainAll()方法获取公共文件,然后对它们进行打印之类的操作。

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(); 
}
ru9i0ody

ru9i0ody3#

如果你正在使用Java8,下面是一个简洁的实现这个逻辑的方法。请注意,这只适用于Java8。它使用了一些lambda表达式和特性,而没有大量的样板代码。希望你至少会觉得它有趣

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);

图纸:

Student1 , Student2
8zzbczxx

8zzbczxx4#

如果您想要一个优雅的解决方案:
1.同时排序
1.按排序列表比较
首先,这是非常简单的。其次,排序是如此令人难以置信地优化,这通常会比任何手动编写的东西都要快,并产生优雅和易于理解的代码。
这里的大多数其他解决方案都是O(n*m)。这种方法是O(n log n + m log m),但常数很小。您可以使用散列表进行查找,这在理论上会产生O(n + m),但常数可能太大。

5anewei6

5anewei65#

下面是一个示例代码,它将在2个列表中打印匹配值和不匹配值

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);
  
}

相关问题