[英]check number of a given character occurence in a String
我想编写一个简单的类来处理字符串(可能是很长的字符串,最多可以包含100万个字符)。 字符串基本上由两个可以相互混合的字符“ a”和“ b”组成。 如果a的个数等于b的个数,则应用会说没关系,否则为NOK。 我想知道如何最有效地做到这一点。 我曾想过使用正则表达式拆分String,然后计算a和b的出现次数,但也许有人知道更好的方法。 对于regex来说还比较陌生,所以请让我知道是否有任何错误。 这是我的早期尝试。
public class Typo {
public static void main(String[] args){
String ver = "";
int na = 0;
int nb = 0;
String regex = ("\\w.+");
Pattern p = Pattern.compile(regex);
String text = "ababababbaba";
if (text.length() == 0){
ver = "OK";
}
else if (text.length() == 1){
ver = "NOK";
}
else if ((text.length() % 2) == 1){
ver = "NOK";
}
else if ((text.length() % 2) == 0){
//check number of a and b and if it equals return OK otherwise NOK
Matcher m1 = p.matcher("a");
while(m1.find()){
na = na + 1;
}
Matcher m2 = p.matcher("b");
while(m2.find()){
nb = nb + 1;
}
if (na == nb){
ver = "OK";
}
else
ver = "NOK";
}
System.out.println(ver);
}
}
为什么需要正则表达式并为此拆分字符串! 您可以简单地遍历字符串并计算a和bs的数量。 您需要保留两个不同的计数器,一个代表a,另一个代表b。 使用正则表达式会降低效率。 如果没有至少遍历字符串一次,就无法获得结果。 因此,使用一个简单的循环来计算a和b。
您可以在循环中进行一次优化。 如果countA - countB
任何时间模大于剩余字符数,则a和b永远不能相等。 这样就可以打破循环了。
如果字符串的长度为奇数,则无需计数。 当元素总数为奇数时,a和b的计数永远不能相等。
您绝对不应该使用正则表达式来解决此问题:一般来说,当您需要计数时,正则表达式不是很好。 您甚至无法编写正则表达式来检查表达式中的方括号是否平衡。
对于这个问题,一个简单的计数器就足够了:在a
上递增,在b
上递减,最后检查零,以了解问题的答案。
boolean check(String s) {
int count = 0;
for (int i = 0 ; i != s.length() ; i++) {
if (s.charAt(i) == 'a') {
count++;
} else { /* it is b */
count--;
}
}
return count == 0;
}
我相信这就是您想要的:
private static boolean check(String input) {
int count = 0;
for (int i = 0; i < input.length(); ++i) {
if (input.charAt(i) == 'a') {
count++;
}
}
return count == input.length() >> 1; // count == input.length()/2
}
如果需要,您可以使用第三方库,例如StringUtils 。 它有一个方法countMatches可以完成工作。
StringUtils.countMatches("abba", "a") = 2
StringUtils.countMatches("abba", "ab") = 1
使用这样简单的东西怎么了? 您做这样简单的事情的想法是多余的,最终会占用更多资源。
String s = "abbb";
int a = 0;
int b = 0;
for(int i = 0; i<s.length(); i++){
if((s.charAt(i) == 'a')){
a += 1;
} else {
b += 1;
}
}
a = 1; b = 3
public class Typo {
public static void main(String[] args){
String ver = "NOK";
String text = "ababababbaba";
if( (text.length() - text.replaceAll("a","").length() ) ==
( text.length() - text.replaceAll("b","").length() ) ) {
ver = "OK";
}
System.out.println(ver);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.