繁体   English   中英

检查字符串中给定字符出现的编号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM