2014-02-09 58 views
1

我正在嘗試編寫一個需要String句子(在main method中給出)的小程序,並計算大寫字符的數量和a的數量。第二部分我有點麻煩。在字符串中獲得正確數量的'a'字符

雖然毫無疑問有多種編寫程序的方法,但我寫了for loops,它跟蹤了String,並完成了我的工作。它可以很好地計算大寫字母的值,但對於a,它將每個字母都計爲一個。我可能會瘋了。

public class CountCharacters { 
    public static void main(String[] args) { 

     charCount("How many UPPER CASE letters, a's, and 0-9 digits are there in this String?"); 
    } 

    public static void charCount(String b) { 
     int upper = 0; 
     int a = 0; 
     for (int i = 0; i < b.length(); i++) { 
      char v = b.charAt(i); 
      if (Character.isUpperCase(v)) { 
       upper++; 
      } 

     } 

     for (int i = 0; i < b.length(); i++) { 
      char t = b.charAt(i); 
      if (Character.isLetter('a')) { 
       a++; 
      } 
     } 
     System.out.println("There are " + upper + " upper case letters, and " + a + " lower case a's in the String"); 
    } 
} 
+0

提示:'Character.isLetter( 'A')'總是返回真實的,因爲「A」是:-)的 – MattR

+0

可能重複一個函[我如何計算一個Java字符串出現序列的次數?](http://stackoverflow.com/questions/5223815/how-do -i-計數的用戶號碼的次-A-序列發生功能於一個-java的字符串) –

回答

3

因爲你正在測試

if(Character.isLetter('a')) 

74倍。

小寫字母'a'是小寫字母'a',每次。 :)

使用

if(t == 'a' || t == 'A') 

if(Character.toLowerCase(t) == 'a') 

我認爲前者是一個比較有效的(更清晰),但無論是好的。

正如在評論中指出,既然你不使用t其他地方,你可以直接測試字符:

for (int i = 0; i < b.length(); i++) { 
    if (b.charAt(i) 'a')) { 
     a++; 
    } 
} 

你可以顯著降低代碼:

public static void charCount(String b) { 
    int upper = 0; 
    int a = 0; 
    for (int i = 0; i < b.length(); i++) { 
     char v = b.charAt(i); 
     if(v == 'a' || v == 'A') { 
     a++; 
     } 
     if(Character.isUpperCase(v)) { 
     upper++; 
     } 
    } 
    System.out.println("There are " + upper + " upper case letters, and " + a + " lower case a's in the String"); 
} 

根據到JavaDoc,Character.isUpperCase(c)只對大寫字母返回true。

1

看看你的表情:

if (Character.isLetter('a')) 

這將始終爲true。

你想:

if (Character.isLetter(t)) 

(另外,你可以靜態導入isLetter而失去字符的前綴的方法。)

0

有可能出錯的isLetter()方法。話雖如此,你不需要它。

int upper = 0; 
int a = 0; 
for (int i = 0; i < b.length(); i++) { 
    char v = b.charAt(i); 
    if (Character.isUpperCase(v)) upper++; 
    if (v == 'A' || v == 'a') a++; 
} 
2

只需使用正則表達式:

int upper = b.replaceAll("[^A-Z]", "").length(); 
int a = b.replaceAll("[^a]", "").length(); 
int digit = b.replaceAll("\\D", "").length(); 

這些線的每個取代你一個空白(從而消除它們)針對所有字符,讓你只用目標字符,那麼你當然使用剩下的東西的長度。

0

你可以用一個循環做到這一點 -

public static void charCount(String b) { 
    int upper = 0; 
    int a = 0; 
    for (int i = 0; i < b.length(); i++) { 
     char v = b.charAt(i); 
     if (Character.isUpperCase(v)) { 
      upper++; 
     } 
     if (v == 'a' || v =='A') { // <-- check lower OR upper. 
      a++; 
     } 
    } 
    System.out.println("There are " + upper + " upper case letters, and " 
     + a + " lower case a's in the String"); 
} 
0

您應該只通過串一次需要循環:

public static void charCount(String b) { 
     int upper = 0; 
     int a = 0; 
     for (int i = 0; i < b.length(); i++) { 
      char c = b.charAt(i); 
      if (Character.isUpperCase(c)) 
       upper++; 

      if (c == 'a') 
       a++; 
     } 
     System.out.println("There are " + upper + " upper case letters, and " + a + " lower case a's in the String"); 
    }    
相關問題