2012-01-29 93 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

相關問題