2012-06-03 98 views
8

我有一個家庭作業分配來計算字符串中的特定字符。計算字符串中的特定字符(Java)

例如:string = "America"

輸出應該=以上a appear 2 times, m appear 1 time, e appear 1 time, r appear 1 time, i appear 1 time and c appear 1 time

public class switchbobo { 

/** 
* @param args 
*/  // TODO Auto-generated method stub 
    public static void main(String[] args){ 
    String s = "BUNANA"; 
    String lower = s.toLowerCase(); 
    char[] c = lower.toCharArray(); // converting to a char array 
    int freq =0, freq2 = 0,freq3 = 0,freq4=0,freq5 = 0; 

    for(int i = 0; i< c.length;i++) { 
     if(c[i]=='a') // looking for 'a' only 
      freq++; 
     if(c[i]=='b') 
      freq2++; 
     if (c[i]=='c') { 
      freq3++; 
     } 

     if (c[i]=='d') { 
      freq4++; 
     }  
    } 
    System.out.println("Total chars "+c.length); 
    if (freq > 0) { 
     System.out.println("Number of 'a' are "+freq); 
    } 
    } 
} 

代碼爲我做了什麼,但我認爲這是沒有意義的有26個變量(一個用於每個字母)。你們有替代結果嗎?

+1

使用一個陣列,26個索引。 (''a' - 'a'== 0,'b' - 'a'== 1',等等)。 – Jeffrey

回答

7

顯然你對每個字母有一個變量的直覺是正確的。

問題是,您沒有任何自動化的方式來對不同的變量進行相同的工作,您沒有任何簡單的語法可以幫助您爲26種不同的工作進行相同的工作(計算單個字符頻率)變量。

那麼你能做什麼?我會提示你向兩個解決方案:

  • 你可以使用數組(但你必須找到一種方法來映射字符a-z到指數0-25,這是有點瑣碎的是你對ASCII編碼的原因)
  • 你可以使用一個HashMap<Character, Integer>這是一個關聯容器,在這種情況下,可以讓你有映射到特定的字符,數字,因此完全符合您的需求
+0

番石榴也可以使用['Multiset '](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multiset.html),但這可能是矯枉過正作業:) –

4

您可以使用字符鍵和Integer值的HashMap

HashMap<Character,Integer> 

迭代通過串

-if the character exists in the map get the Integer value and increment it. 
-if not then insert it to map and set the integer value for 0 

這是一個僞代碼,你必須嘗試編碼它

+0

這將解決任何角色。我喜歡。 –

0

在延續傑克的答案下面的代碼可能是您的解決方案。它使用一個數組來存儲字符的頻率。

public class SwitchBobo 
{ 
    public static void main(String[] args) 
    { 
     String s = "BUNANA"; 
     String lower = s.toLowerCase(); 
     char[] c = lower.toCharArray(); 
     int[] freq = new int[26]; 
     for(int i = 0; i< c.length;i++) 
     { 
     if(c[i] <= 122) 
     { 
      if(c[i] >= 97) 
      { 
       freq[(c[i]-97)]++; 
      } 
     }   
     } 
     System.out.println("Total chars " + c.length); 
     for(int i = 0; i < 26; i++) 
     { 
     if(freq[i] != 0) 
      System.out.println(((char)(i+97)) + "\t" + freq[i]); 
     }  
    } 
} 

它會給下面的輸出:

Total chars 6 
a  2 
b  1 
n  2 
u  1 
+0

關於代碼c [i] -97,會按預期工作嗎?這是我的一個嫌疑犯,因爲變量c是char類型,並且它減去了一個整數。在C語言中,你可以使它工作,但Java是一種更嚴格的打字語言。因此我不鼓勵它。使用ASCII編碼更安全,更傳統。例如,字母'a'的ASCII值是什麼? –

+0

@TheOriginalAndroid:是的。如果沒有,我不會發布它。 '在字符和整數之間執行算術運算時,它實際上是在字符的ascii值和整數之間執行的。這種操作的結果也是一個整數。''a'的ascii值是97! – WickeD

2

我使用的解決方案是一個HashMap。

import java.util.*; 

public class Sample2 { 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    HashMap<Character, Integer> map = new HashMap<Character, Integer>(); 
    String test = "BUNANA"; 
    char[] chars = test.toCharArray(); 

    for(int i=0; i<chars.length;i++) 
    { 
     if(!map.containsKey(chars[i])) 
     { 
      map.put(chars[i], 1); 
     } 
     map.put(chars[i], map.get(chars[i])+1); 
    } 

    System.out.println(map.toString()); 
} 

} 

產生的輸出 - {U = 2,A = 3,B = 2,N = 3}

+0

你試過了嗎?因爲它給每個字母 – David

+0

+1,你已經忘記了其他的,它很好地工作,謝謝! – David

0
int a[]=new int[26];//default with count as 0 
for each chars at string 
if (String having uppercase) 
    a[chars-'A' ]++ 
if lowercase 
then a[chars-'a']++ 
0
public class TestCharCount { 
    public static void main(String args[]) { 
     String s = "america"; 
     int len = s.length(); 
     char[] c = s.toCharArray(); 
     int ct = 0; 
     for (int i = 0; i < len; i++) { 
      ct = 1; 
      for (int j = i + 1; j < len; j++) { 
       if (c[i] == ' ') 
        break; 
       if (c[i] == c[j]) { 
        ct++; 
        c[j] = ' '; 
       } 

      } 
      if (c[i] != ' ') 
       System.out.println("number of occurance(s) of " + c[i] + ":" 
         + ct); 

     } 
    } 
} 
+1

歡迎使用stackoverflow,如果你提供一些解釋來跟隨你的代碼,它會有所幫助。這種方式,而不是複製/粘貼,並希望它的作品,問問題的人將能夠看到爲什麼有效的,爲什麼沒有 – smerny

0

也許可以使用此

public static int CountInstanceOfChar(String text, char character ) { 
    char[] listOfChars = text.toCharArray(); 
    int total = 0 ; 
    for(int charIndex = 0 ; charIndex < listOfChars.length ; charIndex++) 
     if(listOfChars[charIndex] == character) 
      total++; 
    return total; 
} 

例如:

String text = "america"; 
char charToFind = 'a'; 
System.out.println(charToFind +" appear " + CountInstanceOfChar(text,charToFind) +" times"); 
0

在字符串中計數char'l'。

String test = "Hello"; 
    int count=0; 
    for(int i=0;i<test.length();i++){ 
    if(test.charAt(i)== 'l'){ 
     count++; 
     } 
    } 

int count= StringUtils.countMatches("Hello", "l");