2016-08-29 21 views
4

ランダム化された2つのテキストファイルを比較しようとしており、両方のファイルに一致する行を出力しようとしています。 ファイル1:ランダムな順序で2つのテキストファイルをJavaと比較する

Student1 
Student2 
Student3 
Student4 

ファイル2:

Student1 
Student2 

私のコードは以下の通りですよう

Student6 
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(); 
+0

最初のファイルからすべての行を 'ArrayList 'に読み込み、2番目のファイルの各文字列がメソッドによってArrayListに存在する場合は、2番目の読み込み中にhttp://www.tutorialspot.com/java/util/arraylist_indexof.htm – Slavik

+3

ソートしてマージ... google it up –

答えて

5

非常に簡単です=)最初のファイルのすべての結果を保存し、2番目のすべての行と比較してみます。それはこのようになります。

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

異なるしばらくの内側に長すぎる時間とobfuskateロジックを働かせることができる「ながら」これはあなたの、可能な場合はメモリを使用することをお勧めします。

1

Java8を使用している場合は、以下のような方法でこのロジックを実現できます。これはJava 8のみに適用されることに注意してください。それはいくつかのラムダ式と定型的なコードを多く使わずに利用可能な機能を使用します。あなたは少なくとも

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 
2

別の方法としては、2つの配列リストに両方のあなたのファイルを置くと、共通のファイルを取得するための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(); 
} 
0

あなたがエレガントな解決策たい場合は、次の両方

  • は、すべての
  • まずとしてソートされたリストを比較

    1. ソートを、これは非常に簡単です。第2に、並べ替えは非常にうまく最適化されています。これは通常、手作業で書かれたものより高速で、エレガントでわかりやすいコードを生成します。

      ここで、他のほとんどのソリューションはO(n * m)です。このアプローチは、小さな定数を持つO(n log n + m log m)です。理論的にはO(n + m)が得られるが、大きすぎる定数があるかもしれないルックアップにハッシュマップを使うことができる。

    関連する問題