我正试图找出是否存在相同数量的"dog"
和"猫;在给定的CCD_ 2中。
如果它们相等,它应该返回true
,否则返回false
。如果没有while
、for
等循环,我如何才能找到这个?
这是我目前的流程
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()
));
}