-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

那么如果 haystack 来自文件 1,needle 来自文件 2,我希望结果为 2,因为 beers 这个词是部分或相同的,只有两个 haystack 字符串。(啤酒--->我喜欢啤酒和啤酒)-我喜欢stackoverflow没有任何反应)但是当haystack来自file2而needle来自file1时,我希望结果为2。(我喜欢啤酒与文件2的任何内容,我都喜欢旅行,stackoverflow是我喜欢stackoverflow的一部分-1-最后啤酒与啤酒相同-2-)正确的方法是什么?正如我之前所说,无论什么文件是干草堆或给出针的字符串,包含给我相同的结果。

PS在我的例子中结果是一样的,但我认为这是随机的。

我怎样才能做到这一点?

4

1 回答 1

1

我认为您的意思是这两种情况的值可能不同?你显示它们是一样的。

如果要在另一个字符串中查找一个字符串,请使用 String 对象的 indexOf 方法。例如:

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

将返回 1。如果该值不存在,则该方法返回 -1。

因此,如果您想大海捞针,这意味着检查一个文件的每一行是否存在另一个文件中的一行。请记住,如果文件(以及其中的行)很大,这意味着大量的字符串处理,这可能会很慢。你必须在两个方向上都这样做。首先,在文件 1 中获取一行,并将其与文件 2 中的每一行进行比较(除非找到匹配项,在这种情况下,您可以停止从文件 1 中查找该行)。然后移动到文件 1 中的下一行,等等。

反过来,从文件 1 中的文件 2 中查找第 1 行。

我不会描述所有的逻辑,但假设你知道如何打开文件和编写循环,那部分应该不难理解。

于 2011-10-02T11:12:45.070 回答