如何在另一个字符串中搜索字符串列表?

时间:2018-09-13 13:06:53

标签: java string iteration

这是一些有效的代码,但看起来不太雅致。有什么更好的方法来搜索在另一个字符串中是否出现这些字符串?

String AndyDaltonInjury = "broken right thumb";

if (AndyDaltonInjury.toLowerCase().contains("broken") &&
    (AndyDaltonInjury.toLowerCase().contains("knee") ||
    AndyDaltonInjury.toLowerCase().contains("leg")   ||
    AndyDaltonInjury.toLowerCase().contains("ankle") ||
    AndyDaltonInjury.toLowerCase().contains("thumb") ||
    AndyDaltonInjury.toLowerCase().contains("wrist"))) 
{
    System.out.println("Marvin sends in the backup quarterback.");  
}

4 个答案:

答案 0 :(得分:8)

使用Set集合及其方法Set::contains可以用空格(" ")分隔符对拆分数组进行流式处理:

Set<String> set = new HashSet<>(Arrays.asList("knee", "leg", "ankle", "thumb", "wrist"));

String lower = "broken right thumb".toLowerCase();
String split[] = lower.split(" ");
if (lower.contains("broken") && Arrays.stream(split).anyMatch(set::contains)) {
    System.out.println("Marvin sends in the backup quarterback.");
}

此外,我强烈建议您使用小写的变量名。

答案 1 :(得分:0)

您可以将缺少的函数(包含所有/任何)创建为方法,或使用Lambda表示法表达它们:

BiPredicate<String, List<String>> containsAll = (text, words) -> 
    words.stream().allMatch(word -> text.toLowerCase().contains(word));
BiPredicate<String, List<String>> containsAny = (text, words) -> 
    words.stream().anyMatch(word -> text.toLowerCase().contains(word));

if (containsAll.test(AndyDaltonInjury, Arrays.asList("broken")) && 
    containsAny.test(AndyDaltonInjury, Arrays.asList("knee", "leg", "ankle", "thumb", "wrist"))) {
    System.out.println("Marvin sends in the backup quarterback.");
}

答案 2 :(得分:0)

您可以尝试以下方法:

String test = "broken right thumb";

Predicate << ? super String > machCriteria = s - > Stream.of("knee", "leg", "ankle", "thumb", "wrist").anyMatch(e - > e.equals(s.toLowerCase()));
String result = Pattern.compile(" ").splitAsStream(test).anyMatch(machCriteria) ? "Marvin sends in the backup quarterback." : "";
System.out.println(result);

答案 3 :(得分:0)

如果需要根据大量集中的内容检查大量文本,则基于散列的算法可能会为您提供更好的性能。

HashSet是一个很好的首次尝试,因为搜索(测试集合中包含的键)将在O(1)和O(n)之间。

但是,我强烈建议您考虑使用[Bloom Filter][1]的好处。它可以很好地用作预滤波器,因为它可以提供O(k)的可预测性能。因为过滤器的误报率很小,所以您还需要运行第二阶段。

查看Guava BloomFilter以获得良好的实现。

布隆过滤器的另一个好处是它不包含原始数据集,而只是减少了哈希值,这意味着其大小很小。这意味着它非常适合复制,因为它非常高效地进行复制。在像Apache Spark这样的环境中,您甚至可以将其设置为Broadcast变量,因为一旦产生它通常在时间上是恒定的。