我有一个字符串列表。对于每个字符串,我希望查看单词“ joe”是否首次出现。我正在用空格隔开,因为我不想数“ joey”一词。
我当前的代码对单词“ joe”的每次出现进行计数,我如何对其进行编辑,因此它仅对单词的首次出现进行计数,然后移至列表中的下一个字符串。
var defaultData = false;
clientService.getClients(defaultData)
.then(function (res) {
//do something
}).catch(function (err) {
defaultData = true;
clientService.getClients(defaultData)
.then(function (res) {
//do something
}).catch(function (err) {
console.log(err)
});
});
编辑
public int counter(List<String> comments) {
int count = 0;
String word = "joe";
for (String comment : comments) {
String a[] = comment.split(" ");
for (int j = 0; j < a.length; j++) {
if (word.equals(a[j])) {
count++;
}
}
System.out.println(comment);
}
System.out.println("count is " + count);
return count;
}
我希望我的代码为此返回2(每个字符串中都出现了乔)
答案 0 :(得分:2)
您可以使用正则表达式来检查整个String是否包含单词,而无需先将其拆分为单个单词。
匹配单词“ joe”但不匹配“ joey”的正则表达式如下:
\bjoe\b
\b
匹配单词的边界,因此整个表达式匹配单词的开头,然后是单词,该单词必须是joe,然后是单词的结尾。
在Java中,可以通过在字符串上使用matches(pattern)
方法来实现:
"hello joe, how are you?".matches(".*\\bjoe\\b.*");
请注意,matches
函数需要正则表达式匹配整个字符串才能返回true,因此我们必须在开头和结尾添加.*
,它将匹配任意数量的任意字符。 (.
匹配任意字符,*
表示您要匹配前面的子表达式任意次数)
此正则表达式的优点在于,它仍然可以使用标点符号。仅在空格上分割将无法在字符串“ hello joe,你好吗?”中识别出joe。
总结起来,这就是完整的解决方案:
public int countMatches(List<String> comments) {
int numberOfMatches = 0;
for (String comment : comments) {
if (comment.matches(".*\\bjoe\\b.*")) {
numberOfMatches++;
}
}
return numberOfMatches;
}
如果要匹配任意搜索词,则必须小心,因为某些字符在正则表达式中具有特殊含义。我建议使用Pattern.quote
(import java.util.regex.Pattern;
):
String pattern = ".\\b" + Pattern.quote(word) + "\\b.*";
然后,您可以将注释与comment.matches(pattern)
匹配。
答案 1 :(得分:0)
在代码中,您只需要在break;
行之后添加count++;
行。
类似于以下内容:
public int counter(List<String> comments) {
int count = 0;
String word = "joe";
for (String comment : comments) {
String a[] = comment.split(" ");
for (int j = 0; j < a.length; j++) {
if (word.equals(a[j])) {
count++;
break;
}
}
System.out.println(comment);
}
System.out.println("count is " + count);
return count;
}
答案 2 :(得分:0)
正则表达式也可以使这段代码更短。
eftEnum :: (Enum a, Eq a, Ord a) => a -> a -> [a]
eftEnum a b
| a > b = []
| a == b = [a]
| otherwise = a : rest
where rest = eftEnum (succ a) b
编辑:
@Paelle的正则表达式稍好一些,请改用public int counter(List<String> comments) {
String regex = "(.* )?joe( .*)?";
return (int) comments.stream().filter(s -> s.matches(regex)).count();
}
。