这是一些有效的代码,但看起来不太雅致。有什么更好的方法来搜索在另一个字符串中是否出现这些字符串?
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.");
}
答案 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变量,因为一旦产生它通常在时间上是恒定的。