如何在不使用循环的情况下检查字符串中两个单词的出现次数是否相等



我正试图找出是否存在相同数量的"dog"和"猫;在给定的CCD_ 2中。

如果它们相等,它应该返回true,否则返回false。如果没有whilefor等循环,我如何才能找到这个

这是我目前的流程

class Main {
public static boolean catsDogs(String s) {
String cat = "cat";
String dog = "dog";
if (s.contains(cat) && s.contains(dog)) {
return true;
} 
return false;
}
public static void main(String[] args) {
boolean r = catsDogs("catdog");
System.out.println(r); // => true
System.out.println(catsDogs("catcat")); // => false
System.out.println(catsDogs("1cat1cadodog")); // => true
}
}

使用java9+,正则表达式匹配器有一个计数方法:

public static boolean catsDogs(String s) {
Pattern pCat = Pattern.compile("cat");
Pattern pDog = Pattern.compile("dog");
Matcher mCat = pCat.matcher(s);
Matcher mDog = pDog.matcher(s);
return (mCat.results().count() == mDog.results().count());
}

您可以通过替换字符串来使用以下示例(如果您不希望放置拆分(:

public static boolean catsDogs(String s) {
return count(s,"cat") == count(s,"dog");
}
public static int count(String s, String catOrDog) {
return (s.length() - s.replace(catOrDog, "").length()) / catOrDog.length();
}
public static void main(String[] args) {
boolean r = catsDogs("catdog");
System.out.println(r); // => true
System.out.println(catsDogs("catcat")); // => false
System.out.println(catsDogs("1cat1cadodog")); // => true
}

这里有两个基于Java 9Matcher.result()的单行解决方案,它生成与给定字符串中的每个匹配子序列相对应的MatchResult流。

我们还可以通过提供一对正则表达式作为参数,而不是对它们进行硬编码,使这种方法更加通用。

发球((+summingInt((

我们可以通过生成匹配组将MatchResesult的流变成字符串流。并使用收集器teeing()收集数据,预期两个下游收集器和一个function作为其参数,根据每个收集器返回的值生成结果。

public static boolean hasSameFrequency(String str,
String regex1,
String regex2) {

return Pattern.compile(regex1 + "|" + regex2).matcher(str).results()
.map(MatchResult::group)
.collect(Collectors.teeing(
Collectors.summingInt(group -> group.matches(regex1) ? 1 : 0),
Collectors.summingInt(group -> group.matches(regex2) ? 1 : 0),
Objects::equals
));
}

collectingAndThen((+partitioningBy((

类似地,我们可以使用收集器collectingAndThen()partitioningBy()的组合。

与上面介绍的方法相比,这种方法的缺点是partitioningBy()将流元素具体化为映射的值(同时我们只对它们的数量感兴趣(,但它执行的比较较少。

public static boolean hasSameFrequency(String str,
String regex1,
String regex2) {

return Pattern.compile(regex1 + "|" + regex2).matcher(str).results()
.map(MatchResult::group)
.collect(Collectors.collectingAndThen(
Collectors.partitioningBy(group -> group.matches(regex1)),
map -> map.get(true).size() == map.get(false).size()
));
}

相关内容

  • 没有找到相关文章

最新更新