0

2 つの txt ファイルの内容を比較し、異なる単語を別の file3.txt ファイルに書き込みたい

この方法でcompareメソッドを実行して、別のtxtファイルを書きたいと思います。また、コーディングのエラーはありません

私は結果を持っていません。ここに私のコードがあります

4

5 に答える 5

3

私はあなたのコードを単純化してこれに修正しました:

public class TextAreaSample
{
  public static void main(String [] args) throws IOException {
    compare(readFileAsList("deneme1.txt"),
            readFileAsList("deneme2.txt"));
  }

  private static void compare(List<String> strings1, List<String> strings2)
  throws IOException
  {
    final Collator c = Collator.getInstance();
    c.setStrength(Collator.PRIMARY);
    final SortedSet<String>
      union = new TreeSet<String>(c),
      intersection = new TreeSet<String>(c);
    union.addAll(strings1);
    union.addAll(strings2);
    intersection.addAll(strings1);
    intersection.retainAll(strings2);
    union.removeAll(intersection);
    write(union, "deneme3.txt");
  }

  private static void write(Collection<String> out, String fname) throws IOException {
    FileWriter writer = new FileWriter(new File(fname));
    try { for (String s : out) writer.write(s + "\n"); }
    finally { writer.close(); }
  }

  private static List<String> readFileAsList(String name) throws IOException {
    final List<String> ret = new ArrayList<String>();
    final BufferedReader br = new BufferedReader(new FileReader(name));
    try {
      String strLine;
      while ((strLine = br.readLine()) != null) ret.add(strLine);
      return ret;
    } finally { br.close(); }
  }
}

私はdeneme1.txtを持っています:

plane
horoscope
microscope

deneme2.txt:

phone
mobile
plane

deneme3.txtでの出力:

horoscope
microscope
mobile
phone
于 2012-08-03T09:30:07.253 に答える
3

次のファイルを使用してプログラムを実行しましたが、問題を再現できませんでした。

deneme1

abc
def
ghi

deneme2

abc
ghi
klm

そしてdeneme3は以下の内容で作成されました。

abc
ghi

編集

あなたは反対の行動を望んでいるようです。一部のメソッドは不必要に複雑であり、標準の JDK の適切なツールを使用することで大幅に短縮できます。単純化された実装の例を以下に示します (2 つのファイル間で共通ではない単語のみを保持します) 。この例では大文字と小文字が区別されます。

public class TextAreaSample {

    public static void main(String[] args) throws IOException {
        //readAllLines does what you do in readFileAsList
        List<String> strings1 = Files.readAllLines(Paths.get("C:/temp/deneme1.txt"), Charset.defaultCharset());
        List<String> strings2 = Files.readAllLines(Paths.get("C:\\temp\\deneme2.txt"), Charset.defaultCharset());
        Set<String> notInCommon = getNotInCommon(strings1, strings2);
        write(notInCommon, "C:\\temp\\deneme3.txt");
    }

    private static void write(Collection<String> out, String fname) throws IOException {
        FileWriter writer = new FileWriter(new File("C:\\temp\\deneme3.txt"));
        for (String s : out) {
            writer.write(s + "\n");
        }
        writer.close();
    }

    private static Set<String> getNotInCommon(List<String> strings1, List<String> strings2) {
        //Sets are great to get unique lists and check commonality
        Set<String> onlyInFile1 = new HashSet<String>(strings1);
        onlyInFile1.removeAll(strings2); //remove strings in s1 AND s2
        Set<String> onlyInFile2 = new HashSet<String>(strings2);
        onlyInFile2.removeAll(strings1); //remove strings in s1 AND s2
        Set<String> notInCommon = new HashSet<>();
        notInCommon.addAll(onlyInFile1);
        notInCommon.addAll(onlyInFile2);

        return notInCommon;
    }
}
于 2012-08-03T09:25:27.283 に答える
0

私の提案は、すべてを一度に解決しようとしないことです。1 つのライナーを使用して比較メソッドを簡素化できます strings1.retainAll(strings2)

詳細については、これを参照してください http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#retainAll(java.util.Collection )

そして、strings1 の内容を出力して問題がないか確認し、そのファイル書き込み部分を解決します。

于 2012-08-03T09:25:39.407 に答える
0

3 番目のファイルdeneme3.txtを閉じずに 2 回開いています。2回目( )は例外がスローされると思いwrite()ますので、書き込みはありません。最初に出現したFileWriter writer = new FileWriter(new File("D:\\Denemeler\\deneme3.txt"));(の 1 つcompare()) を削除すれば問題ありません。

于 2012-08-03T09:29:17.677 に答える
-2

ライターを閉じる前に flush() する必要があると思います。

private static void write(ArrayList<String> out, String fname) throws IOException {
    FileWriter writer = new FileWriter(new File("D:\\Denemeler\\deneme3.txt"));
    for (int i = 0; i < out.size(); i++) {
        writer.write(out.get(i) + "\n");
    }
    // Flush the writer before closing it.
    writer.flush();

    writer.close();
}
于 2012-08-03T09:16:40.727 に答える