2

順番ではありませんが、サブストリング0と10の間に同じ値が含まれているはずの2つのファイルがあります。私は各ファイルの値をアウトプリントすることに成功しましたが、値が最初のファイルにあり、2番目のファイルにない、またはその逆であると報告する方法を知る必要があります。ファイルはこれらの形式です。

6436346346....Other details
9348734873....Other details
9349839829....Other details

2番目のファイル

8484545487....Other details
9348734873....Other details
9349839829....Other details

最初のファイルの最初のレコードは2番目のファイルに表示されず、2番目のファイルの最初のレコードは最初のファイルに表示されません。この不一致を次の形式で報告できるようにする必要があります。

Record 6436346346 is in the firstfile and not in the secondfile.
Record 8484545487 is in the secondfile and not in the firstfile.

これが私が現在持っているコードで、比較するために2つのファイルから必要な出力を提供します。

package compare.numbers;

import java.io.*;

/**
 *
 * @author implvcb
 */
 public class CompareNumbers {

/**
 * @param args the command line arguments
 */
 public static void main(String[] args) {
    // TODO code application logic here
    File f = new File("C:/Analysis/");
    String line;
    String line1;
    try {
        String firstfile = "C:/Analysis/RL001.TXT";
        FileInputStream fs = new FileInputStream(firstfile);
        BufferedReader br = new BufferedReader(new InputStreamReader(fs));
        while ((line = br.readLine()) != null) {
            String account = line.substring(0, 10);
             System.out.println(account);


        }
        String secondfile = "C:/Analysis/RL003.TXT";
        FileInputStream fs1 = new FileInputStream(secondfile);
        BufferedReader br1 = new BufferedReader(new InputStreamReader(fs1));
        while ((line1 = br1.readLine()) != null) {
            String account1 = line1.substring(0, 10);
            System.out.println(account1);
        }

    } catch (Exception e) {
        e.fillInStackTrace();
    }



}
}

私がこれを効果的に達成する方法を手伝ってください。私はそれがJavaに不慣れであり、簡単にアイデアをつかむことができないかもしれないと言う必要があったと思いますが、試みています。

4

6 に答える 6

2

これを行うためのサンプルコードは次のとおりです。

 public static void eliminateCommon(String file1, String file2) throws IOException
{
    List<String> lines1 = readLines(file1);
    List<String> lines2 = readLines(file2);

    Iterator<String> linesItr = lines1.iterator();
    while (linesItr.hasNext()) {
        String checkLine = linesItr.next();
        if (lines2.contains(checkLine)) {
            linesItr.remove();
            lines2.remove(checkLine);
        }
    }

    //now lines1 will contain string that are not present in lines2
    //now lines2 will contain string that are not present in lines1
    System.out.println(lines1);
    System.out.println(lines2);

}

public static List<String> readLines(String fileName) throws IOException
{
    List<String> lines = new ArrayList<String>();
    FileInputStream fs = new FileInputStream(fileName);
    BufferedReader br = new BufferedReader(new InputStreamReader(fs));
    String line = null;
    while ((line = br.readLine()) != null) {
        String account = line.substring(0, 10);
        lines.add(account);
    }
    return lines;
}
于 2012-07-09T11:56:43.630 に答える
2

おそらくあなたはこのようなものを探しています

Set<String> set1 = new HashSet<>(FileUtils.readLines(new File("C:/Analysis/RL001.TXT")));
Set<String> set2 = new HashSet<>(FileUtils.readLines(new File("C:/Analysis/RL003.TXT")));

Set<String> onlyInSet1 = new HashSet<>(set1);
onlyInSet1.removeAll(set2);

Set<String> onlyInSet2 = new HashSet<>(set2);
onlyInSet2.removeAll(set1);
于 2012-07-09T12:03:15.413 に答える
1

ファイルが常に同じ形式であり、各readLine()関数が異なる数値を返すことを保証する場合は、単一の文字列ではなく、文字列の配列を使用しないでください。その後、結果をより簡単に比較できます。

于 2012-07-09T11:54:36.257 に答える
1
  • それに応じて、各ファイルの値を2つの別々HashSetのファイルに配置します。
  • の1つを繰り返し処理し、HashSet各値が他の値に存在するかどうかを確認しますHashSet。そうでない場合は報告してください。
  • 他のことを繰り返してHashSet、これに対して同じことをします。
于 2012-07-09T11:57:04.073 に答える
1

2つのスキャナーを開き、:

    final TreeSet<Integer> ts1 = new TreeSet<Integer>();    
    final TreeSet<Integer> ts2 = new TreeSet<Integer>();
    while (scan1.hasNextLine() && scan2.hasNexLine) {
            ts1.add(Integer.valueOf(scan1.nextLigne().subString(0,10));
            ts1.add(Integer.valueOf(scan1.nextLigne().subString(0,10));
        }
You can now compare ordered results of the two trees

TreeSetで変更された編集

于 2012-07-09T11:58:06.423 に答える
1

はい、最初に2セットの文字列をコレクションに保存します

Set<String> s1 = new HashSet<String>(), s2 = new HashSet<String>();
//...
while ((line = br.readLine()) != null) {
  //...
  s1.add(line);
}

次に、それらのセットを比較して、両方のセットに表示されない要素を見つけることができます。あなたはここでそれを行う方法に関するいくつかのアイデアを見つけることができます。

行番号も知る必要がある場合は、文字列ラッパーを作成するだけです。

class Element {
  public String str;
  public int lineNr;

  public boolean equals(Element compElement) {
    return compElement.str.equals(str);
  }
}

その後、代わりに使用できますSet<Element>

于 2012-07-09T12:01:52.323 に答える