-1
  static boolean contains(Iterable<String> haystack, String needle) {
    for (String s : haystack) {
        if (s.contains(needle)) {
        return true;
      }
    }
    return false;
  }

  static void containsAll() throws IOException {
    List<String> words = loadLines("opacial.txt");
    List<String> tocheck = loadLines("queries0.txt");
    System.out.println(words.size());
    System.out.println(tocheck.size());
    int index2 = 0;
    for (String s : tocheck) {
      if (contains(words, s)) {
          index2++;
          //return false;

      }

     }
    System.out.println(index2);
    //return true;
  }

私はこれを行うcontains(上記のコード)のようなメソッドを探しています:それは針が干し草の山に存在するかどうか、または針が干し草の山の文字列の一部であるかどうかをチェックします。その場合(上記のコード)、干し草の山に行くファイルと針を与えるファイルを逆にすると、結果は同じになります。しかし、私はそれを望んでいません。例えば:

File 1: 
i love beers
i like travelling
stackoverflow
beers

And File2 :    
beers
i love stackoverflow

次に、干し草の山がファイル1からのもので、針がファイル2からのものである場合、ビールという単語が一部であるため、結果を2にします。または、干し草の山の2つの文字列だけで同じです。(ビール--->私はビールとビールが大好きです)-stackoverflowが大好きですが何も起こりません)しかし、干し草の山がfile2から来て、針がfile1から来るとき、私は結果を2にしたいです(私はビールが一部または同じではありませんファイル2のいずれか、私は同じように旅行するのが好きです、stackoverflowは私がstackoverflow -1-を愛する一部であり、最後にビールはビールと同じです-2-)そのための正しい方法は何ですか?前に言ったように、containsは、どのファイルが干し草の山であるか、針の文字列を与えるかに関係なく、同じ結果をもたらします。

私の例のPSの結果は同じですが、それはランダムだと思います。

どうやってやるの?

4

1 に答える 1

1

おそらく2つのケースで値が異なるはずだということだと思いますか?あなたはそれらが同じであることを示します。

別の文字列内の文字列を検索する場合は、StringオブジェクトのindexOfメソッドを使用します。例えば:

String s = "abcdef";
s.indexOf("b");

1を返します。値が存在しない場合、メソッドは-1を返します。

したがって、干し草の山で針を見つけたい場合は、あるファイルのすべての行をチェックして、別のファイルに行が存在するかどうかを確認することを意味します。ファイル(およびファイル内の行)が大きい場合、これは多くの文字列処理を意味し、速度が低下する可能性があることに注意してください。そして、あなたはそれを両方向に行わなければならないでしょう。まず、ファイル1の行を取得し、それをファイル2のすべての行と比較します(一致するものが見つからない場合は、ファイル1からの行の検索を停止できます)。次に、ファイル1などの次の行に移動します。

逆に、ファイル1のファイル2から1行目を探します。

すべてのロジックについては説明しませんが、ファイルを開いてループを書き込む方法を知っていると仮定すると、その部分を理解するのはそれほど難しくありません。

于 2011-10-02T11:12:45.070 に答える