2012-05-20 46 views
5

我需要計算單詞的數量,我假設正確的方法是通過計算字符串中前一個字符不是字母的次數(即其他字符),因爲這是假設有將是字符串中的冒號,空格,製表符和其他符號。 所以剛開始我的想法是遍歷每個字符,並指望有多少次,你不會得到一個字母如何計算字符串中的字數?

for(int i = 0; i < string.length(); i++) { 
     for(int j = 0; i < alphabets.length(); j++) { 
     if (string.charAt(i-1) == alphabets.charAt(j)) { 
      counter++; 
     } 
    } 
    } 

但是我總是會得到一個數組,因爲這個邊界的信。所以,我需要一點幫助或者其他更有效的方式。 我想到使用匹配只有[a-zA-z]但我不知道如何處理一個字符串來計算它發生的次數。

謝謝

+3

java中只有一個單詞。 –

+2

這是功課嗎? –

+0

這是計數*所有*詞,還是僅*獨特*詞? –

回答

2

你的建議使用像「[A-Za-z]」的正則表達式可以正常工作。在一個拆分命令中,你可以將其拆分,如:

String [] words =「示例測試:一,二,三」.split(「[^ A-Za-z] +」);

編輯:如果你只是在尋找原始速度,這將更快地完成這項工作。

public static int countWords(String str) { 
    char[] sentence = str.toCharArray(); 
    boolean inWord = false; 
    int wordCt = 0; 
    for (char c : sentence) { 
     if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') { 
      if (!inWord) { 
       wordCt++; 
       inWord = true; 
      } 
     } else { 
      inWord = false; 
     } 
    } 
    return wordCt; 
} 
+0

到目前爲止,我認爲將它們分開是一種更有效的方式。而且我認爲這也會讓我更容易解決下一個任務。它確實需要更多的處理時間,但我認爲我現在沒有其他選擇。 – nfnmy

+0

+1 - 這正是我記住的算法(你已經編碼)。 @nfnmy分裂的方法有失敗的角落情況,它也比較慢。我不確定我明白你爲什麼選擇使用它。 – cheeken

+0

是的,這是一個非常有效的代碼。但我認爲現在我將使用split方法,這使得我的任務在操作數組時更易於進行其他統計計算。謝謝phatfingers。我一定會保留這個參考,因爲我以前沒有看過這個算法。歡呼天才! – nfnmy

3

您可以使用String.split()將字符串轉換成一個數組,每個元素一個字。詞的數量由數組的長度給出:

int words = myString.split("\s+").length; 
+2

Count?該數組具有「長度」屬性。 –

+0

也許可以使用正則表達式來像\ s +一樣分割。 –

+0

所以我應該嘗試根據字符是否與[a-zA-Z],hmmm匹配將這個長字符串拆分爲數組。 – nfnmy

0
if (string.charAt(i-1) == alphabets.charAt(j)) { 
     counter++; 
    } 

你增加計數器如果字符是一些字母字符。如果它是字母字符,您應該增加它。

1

你得到一個IndexOutOfBoundsException的原因可能是因爲當我是0時,你的內循環將會有string.charAt(i-1)這會引發一個異常,因爲0-1是-1。如果你確定你的方法可行,儘管你可以使用更高效的技術。

1

直接尋址的代碼,你的第一個循環有 = 0的的第一個值,但隨後你問

string.charAt(I-1)= string.charAt (-1),

這是你的數組越界來自何處。

第二環路具有另一個問題:

對(INT J = 0; < alphabets.length(); J ++){

還可能要考慮撇號作爲單詞的一部分。

+0

+1查找這兩個錯誤 – phatfingers

2

這個問題稍微比你的算法允許的更復雜。

  • 如果連續有兩個或多個空格怎麼辦?
  • 如果字符串以空格(或非單詞字符)開頭或結尾怎麼辦?

這看起來像家庭作業,所以我不想提供任何代碼。我建議一個更簡單的思路替代方法。

  • 逐個瀏覽字符串中的字符。
  • 做一些事情要記住,如果您目前正在掃描一個字或如果你目前沒有掃描一個字。
  • 做一些事情來確定你什麼時候進入或離開一個單詞,並相應地增加你的計數器。
+0

感謝您的提示。是的,我並不真正期待任何代碼,只是更多的提示,以及如何更有效地解決這個問題。不太喜歡用答案來填充。 – nfnmy