2012-01-29 50 views
0

我想写一个简单的类来处理字符串(可能是字符串长达1mil字符)。字符串基本上由两个可能相互混合的字符“a”和“b”组成。如果a的数量等于b的话,那么应用程序会说它是OK的,否则NOK。我想知道如何最有效地做到这一点。我想用正则表达式来分割字符串,然后计算a和b的出现次数,但也许有人知道更好的方法来做到这一点。对于正则表达式相对来说比较新,所以请让我知道是否有任何错误。这是我的早期尝试。检查字符串中出现给定字符的编号

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

} 
+2

那岂不是更容易刚过字符循环和计数各是多少?我发现不可能相信使用正则表达式会更快 - 但这对于基准来说是微不足道的。你有吗? – 2012-01-29 19:20:44

+0

目前我有一个字符串问题,如“abbb”,因为他们返回好的时候,他们不应该。而且对于很长的字符串也有优化问题。 – aretai 2012-01-29 19:21:17

+0

@戴夫我不确定就绩效而言,速度更快。我认为对于v.long字符串正则表达式可能会更快,但我不确定。你会如何建议在我的字符串上执行这样的迭代? – aretai 2012-01-29 19:22:39

回答

3

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

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

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

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; 
} 
+0

感谢您的输入 – aretai 2012-01-29 19:57:25

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 
} 
1

如果你愿意,你可以使用第三方库像StringUtils。它有一个方法countMatches它将完成这项工作。

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

谢谢,你总是可以学到新的东西。 – aretai 2012-01-29 19:57:13

+0

是的,你总是可以。 – RanRag 2012-01-29 19:58:56

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

+0

很想尝试一下诸如正则表达式这样的新东西,并认为这会让事情变得更快,但是好像不是。 – aretai 2012-01-29 19:56:21

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

谢谢你是一个非常有趣的答案 – aretai 2012-01-30 12:43:33

+0

不客气 – Nurlan 2012-01-30 14:53:58

相关问题