1

こんにちは、ユーザーから .txt ファイルを読み取る文字列配列のマージソート プログラムを作成しました。しかし、私が今やりたいことは、両方のファイルを比較して、ファイル 1 の単語を出力し、ファイル 2 の単語を出力することです。最後に、私はそれを実装することはできません。これが私が持っているものです、

FileIO reader = new FileIO();
     String words[] = reader.load("C:\\list1.txt");
     String list[] = reader.load("C:\\list2.txt");

     mergeSort(words);
     mergeSort(list);
     String x = null ;

     for(int i = 0; i<words.length; i++)
     {
         for(int j = 0; j<list.length; j++)
         {
                 if(!words[i].equals(list[j]))
                 {
                      x = words[i];
                 }
         }
     }

     System.out.println(x);

どんな助けや提案も感謝します!

4

5 に答える 5

1

最初の配列にあるが 2 番目の配列には存在しない単語をチェックしたい場合は、次のようにすることができます。

 boolean notEqual = true;           
 for(int i = 0; i<words.length; i++)
     {
         for(int j = 0; j<list.length && notEqual; j++)
         {
                 if(words[i].equals(list[j]))     // If the word of file one exist
                 {                                // file two we set notEqual to false
                      notEqual = false;           // and we terminate the inner cycle
                 }
         }
         if(notEqual)                      // If the notEqual remained  true
           System.out.println(words[i]);   // we print the the element of file one
                                           // that do not exist in the second file

         notEqual = true;                  // set variable to true to be used check
     }                                     // the other words of file one.

基本的に、最初のファイル (配列の文字列) から単語を取得し、ファイル 2 に等しい単語があるかどうかを確認します。見つかった場合は、制御変数notEqualを に設定しfalseて、内側の for ループから抜け出し、単語を出力しません。それ以外の場合、ファイル 1 の単語と一致する単語がファイル 2 にない場合、制御変数notEqualは になりますtrue。したがって、要素を内側のループ for の外側に出力します。

必要に応じて、印刷ステートメントを、一意の単語を追加の配列に格納する別のものに置き換えることができます。

最初の解決策よりも遅いですが、別の解決策:

     List <String> file1Words = Arrays.asList(words);
     List <String> file2Words = Arrays.asList(list);

     for(String s : file1Words)
        if(!file2Words.contains(s))
          System.out.println(s);

メソッドArrays.asListを使用して配列をリストに変換し、メソッドcontainsを使用して、最初のファイルの単語が 2 番目のファイルにあるかどうかを確認します。

于 2012-12-12T14:51:04.347 に答える
1

配列をセットに変換しないのはなぜですか? 次に、単に result = wordsSet.removeAll(listSet); を実行できます。

結果には、list2.txt に存在しないすべての単語が含まれます。

また、セットは重複を削除することに注意してください;)

于 2012-12-12T15:27:30.127 に答える
0

これがバージョンです(ただし、並べ替えは使用しません)

    String[] file1 = {"word1", "word2", "word3", "word4"};
    String[] file2 = {"word2", "word3"};
    List<String> l1 = new ArrayList(Arrays.asList(file1));
    List<String> l2 = Arrays.asList(file2);
    l1.removeAll(l2);
    System.out.println("Not in file2 " + l1);

印刷します

Not in file2 [word1, word4]
于 2012-12-12T15:06:37.483 に答える
0

これはちょっと近いように見えます。あなたがしていることは、のすべての文字列に対してwords、それをのすべての単語と比較しているので、にないlist文字列が1つでもある場合は、が設定されます。listwordsx

私が提案するのはに変更if(!words[i].equals(list[j]))することif(words[i].equals(list[j]))です。これで、の文字列がにwords表示されることがわかったlistので、表示する必要はありません。単語を見ずに完全に循環する場合はlist、それを説明する必要があることがわかります。だからこのようなもの:

 for(int i = 0; i<words.length; i++)
 {
     boolean wordFoundInList = false;

     for(int j = 0; j<list.length; j++)
     {
             if(words[i].equals(list[j]))
             {
                  wordFoundInList = true;
                  break;
             }
     }

     if (!wordFoundInList) {
         System.out.println(x);
     }
 }
于 2012-12-12T14:52:19.050 に答える
0

ループを通過して、list.length-1 に達したときに追加することもできます。一致する場合は、すべてのものを壊すことができます

FileIO reader = new FileIO();
String words[] = reader.load("C:\\list1.txt");
String list[] = reader.load("C:\\list2.txt");

mergeSort(words);
mergeSort(list);
//never ever null
String x = "" ;

for(int i = 0; i<words.length; i++)
{
    for(int j = 0; j<list.length; j++)
    {
            if(words[i].equals(list[j]))
                 break;
            if(j == list.length-1)
                 x += words[i] + " ";
    }
}

System.out.println(x);
于 2012-12-12T14:56:22.623 に答える