使用Java以随机顺序比较两个文本文件

时间:2016-08-29 14:07:55

标签: java bufferedreader printwriter

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

Claimant

文件2:

Claim

我希望输出为

Student1
Student2
Student3
Student4

我的代码如下。

Student6
Student1
Student2

4 个答案:

答案 0 :(得分:5)

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

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

最好在可能的情况下使用内存,而且&#39; while&#39;在不同的时间里可以工作太长时间并且晦涩的逻辑。

答案 1 :(得分:2)

另一种方法是将两个文件放在两个arraylists中,并使用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(); 
}

答案 2 :(得分:1)

如果您使用的是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

答案 3 :(得分:0)

如果你想要一个优雅的解决方案:

  1. 排序
  2. 按排序列表进行比较
  3. 首先,这很简单。其次,排序是非常优化的,这通常比手动编写的任何东西都快,并且产生优雅且易于理解的代码。

    这里的大多数其他解决方案都是O(n * m)。该方法是O(n log n + m log m),具有小常数。您可以使用哈希映射进行查找,理论上会产生O(n + m),但可能会有太大的常量。