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

时间:2012-01-29 19:18:07

标签: java regex string

我想编写一个简单的类来处理字符串(可能是非常长的字符串,最多可达1mil字符)。字符串基本上由两个字符“a”和“b”组成,它们可以相互混合。如果一个相同数量的b的数量然后app会说它没关系,否则NOK。我想知道如何最有效地做到这一点。我想过使用正则表达式来分割字符串,然后计算一个和那个的出现,但也许有人知道更好的方法。对于正则表达式来说相对较新,所以如果有任何错误,请告诉我。这是我早期的尝试。

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);
    }

}

6 个答案:

答案 0 :(得分:3)

为什么需要正则表达式并为此分割字符串!您可以简单地遍历字符串并计算a和bs的数量。你需要保留两个不同的计数器,一个用于a,一个用于b。使用正则表达式效率会降低。如果没有遍历字符串至少一次就无法获得结果。因此,使用一个简单的循环来计算a和b。

  • 您可以在循环中进行一次优化。如果任何时候countA - countB的mod大于剩余字符数,则a和b永远不能相等。所以你可以打破循环。

  • 如果字符串的长度是奇数,则无需计数。当元素总数为奇数时,a和b的计数永远不能相等。

答案 1 :(得分:1)

你绝对不应该使用正则表达式解决这个问题:一般来说,当你需要计算任何东西时,正则表达式并不好。你甚至不能编写正则表达式来检查表达式中的括号是否平衡。

对于这个问题,一个简单的计数器就足够了: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;
}

答案 2 :(得分:1)

我相信这就是你想要的:

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
}

答案 3 :(得分:1)

如果您愿意,可以使用StringUtils之类的第三方库。它有一个方法countMatches,可以完成这项工作。

StringUtils.countMatches("abba", "a")   = 2
StringUtils.countMatches("abba", "ab")  = 1

答案 4 :(得分: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

答案 5 :(得分:1)

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);
    }
}