检查字符串是否包含数组中的所有字符串

6
如何检查一个字符串是否包含数组中的所有字符串。
我的当前代码如下:
String word = "abc";
String[] keywords = {"a", "d"};

for(int i = 0; i < keywords.length; i++){
    if(word.contains(keywords[i])){
       System.out.println("Yes");
    }else{
       System.out.println("No");   
    }
}

你的当前代码有什么问题? - President James K. Polk
7个回答

11

如果将代码封装成单独的方法,它看起来会更加优美:

public static boolean containsAllWords(String word, String ...keywords) {
    for (String k : keywords)
        if (!word.contains(k)) return false;
    return true;
}

8
如果您使用的是Java 8+,您可以使用一个Stream并测试所有元素是否符合您的条件,只需一行代码就可完成。类似于:
if (Stream.of(keywords).allMatch(word::contains)) {
    System.out.println("Yes");
} else {
    System.out.println("No");
}

在早期版本中,或者如果您想了解上面的内容是在做什么,它可能看起来像这样:
boolean allMatch = true;
for (String kw : keywords) {  // <-- for each kw in keywords
    if (!word.contains(kw)) { // <-- if "word" doesn't contain kw
        allMatch = false;     // <-- set allMatch to false
        break;                // <-- stop checking
    }
}
if (allMatch) {
    System.out.println("Yes");
} else {
    System.out.println("No");
}

5

使用一个布尔变量来告诉你是否匹配了每个关键字。将其默认值设置为true。然后检查每个关键字:如果有任何一个不包含在你的单词中,停止搜索并将变量设置为false

boolean containsAll = true; 
for (String keyword : keywords){
    if (!word.contains(keyword)){
       containsAll = false;
       break;
    }
}

我更喜欢这种方式,而不是使用多个返回语句。虽然只有小的改动,boolean containsAll; for (String keyword : keywords){ containsAll = word.contains(keyword); if (!containsAll){ break; } } - barryku

0

注意:此解决方案仅适用于您的关键字只包含一个字符的情况,如果您的关键字包含多个字符,则已经有很多答案提到了这一点。

使用一行代码:

boolean contain = Arrays.asList(word.split("")).containsAll(Arrays.asList(keywords));

这个想法是:

String word = "abc";
String[] split = word.split("");

将字符串拆分为字符数组 split = {a, b, c}

String[] keywords = {"a", "b"};

使用containsAll检查您的array1是否包含第二个array2的所有元素

boolean contain = Arrays.asList(split).containsAll(Arrays.asList(keywords));

@CoronA,但是原帖的例子只包含一个字母,而不像你所做的那样包含两个。 - Youcef LAIDANI
1
@JCF:算法通常不是解决例子,而是解决问题。 - CoronA
@CoronA,我认为现在已经修复了所有问题,对吧?请检查我的编辑 :) - Youcef LAIDANI

-1

可以使用StringUtils (org.apache.commons.lang.StringUtils)。它将返回关键字第一次出现的索引,如果没有找到则返回-1。

StringUtils.indexOfAny(word, keywords);

或者您可以使用Arrays,它将返回布尔值。

Arrays.asList(word).contains(keywords)

有一个方法 StringUtils::containsAny,但是 OP 需要检查所有搜索字符串。 Arrays.asList(word) 将返回一个只包含单个元素 word 的列表。方法 Collections::contains 无法接收数组。虽然有方法 Collections::containsAll。但这并不起作用。 - Terran

-2

简单地使用一个计数器:

String word = "abc";
String[] keywords = {"a", "d"};

int counter = 0;

for(int i = 0; i < keywords.length; i++){
    if(word.contains(keywords[i])){
       counter++;
    }
}

if(counter == keywords.length){
   System.out.println("Yes");
}else{
   System.out.println("No");   
}

如果计数器等于关键词长度,则表示所有元素都包含在内。使用此解决方案,您还可以找出单词匹配了多少个关键字。

我不明白你的意思,抱歉。 - Aurasphere

-2
更好的代码应该是:
for(String s: keywords){
    if(word.contains(s)){
       System.out.println("Yes");
    }else{
       System.out.println("No");   
    }
}

你忘记了break语句。 - gifpif
在发表评论之前,请确保您的代码正确,并且要注意解释您的代码。 - kavetiraviteja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接