2014-01-24 74 views
0

好吧,身份證認爲自己知道的基礎知識和一些先進的Java,但仍然沒有勇氣開始編程我的想法,我有。這是一個簡單的程序,我想出了,基本上輸出特定字母的量你的文字已經(我想我的措辭是錯誤的...)這是我的代碼:一個更簡單和有效的方法來做到這一點?

public class gene { 

public static void main(String[] args) { 

    String[] phrases = {"hello", "egg", "learning", "ferrero", "rocher", 
      "Horologe", "Twinling"}; 
    int a=0; 
    int b=0; 
    int c=0; 
    int d=0; 
    int e=0; 
    int f=0; 
    int g=0; 
    int h=0; 
    int i=0; 
    int j=0; 
    int k=0; 
    int l=0; 
    int m=0; 
    int n=0; 
    int o=0; 
    int p=0; 
    int q=0; 
    int r=0; 
    int s=0; 
    int t=0; 
    int u=0; 
    int v=0; 
    int w=0; 
    int x=0; 
    int y=0; 
    int z=0; 

    for(int ii =0; ii <phrases.length; ii++){ 
    char[] charphrases = phrases[ii].toCharArray(); 
    for(int iii = 0; iii<charphrases.length; iii++){ 
     switch(charphrases[iii]){ 
     case ('a'): 
      a++; 
     break;   
    case ('b'): 
     b++; 
    break; 
    case ('c'): 
     c++; 
    break; 
    case ('d'): 
     d++; 
    break; 
    case ('e'): 
     e++; 
    break; 
    case ('f'): 
     f++; 
    break; 
    case ('g'): 
     g++; 
    break; 
    case ('h'): 
     h++; 
    break; 
    case ('i'): 
     i++; 
    break; 
    case ('j'): 
     j++; 
    break; 
    case ('k'): 
     k++; 
    break; 
    case ('l'): 
     l++; 
    break; 
    case ('m'): 
     m++; 
    break; 
    case ('n'): 
     n++; 
    break; 
    case ('o'): 
     o++; 
    break; 
    case ('p'): 
     p++; 
    break; 
    case ('q'): 
     q++; 
    break; 
    case ('r'): 
     r++; 
    break; 
    case ('s'): 
     s++; 
    break; 
    case ('t'): 
     t++; 
    break; 
    case ('u'): 
     u++; 
    break; 
    case ('v'): 
     v++; 
    break; 
    case ('w'): 
     w++; 
    break; 
    case ('x'): 
     x++; 
    break; 
    case ('y'): 
     y++; 
    break; 
    case ('z'): 
     z++; 
    break; 
     } 
    } 
    } 

    System.out.println("A:" + a + "\n" + "B:" + b + "\n" +"C:" + c + "\n" +"D:" + d + "\n" +"E:" + e + "\n" +"F:" + f + "\n" +"G:" + g + "\n" +"H:" + h + "\n" +"I:" + i+ "\n" +"J:" + j + "\n" +"K:" + k + "\n" +"L:" + l + "\n" +"M:" + m + "\n" +"N:" + n + "\n" +"O:" + o + "\n" +"P:" + p + "\n" +"Q:" + q + "\n" +"R:" + r+ "\n" +"S:" + s + "\n" +"T:" + t + "\n" +"U:" + u + "\n" +"V:" + v + "\n" +"W:" + w + "\n" +"X:" + x + "\n" +"Y:" + y + "\n" +"Z:" + z + "\n" + z); 
    } 

}

正如你可以看到,它對於這樣一個簡單的程序非常長,毫無疑問有一個更短的寫法。有人可以告訴我在哪裏可以縮小程序,使其更短,更高效。

+0

請修正你的標題。它應該描述實際問題。 – EJP

+3

瞭解[arrays](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html)。你可以用一個數組來代替26個單獨的變量。 – Jesper

+1

不錯的地方可能是[http://codereview.stackexchange.com/](http://codereview.stackexchange.com/)在這裏,你的代碼得到審查。 :) –

回答

1

你可以有26個成員而不是26個變量。我們知道0-25中的每個索引代表什麼(0是'A',1是'B',2是'C'等等...然後爲了增加這個字母,它的索引可以通過轉換char到一個整數。(轉換將要求您手頭上有一個ASCII參考,任何都行)。學習到字符和整數之間的轉換是,只要你明白了必要的補償相對比較簡單。

6

如何

int[] count = new int[26]; 

你可以做

for(char c: string.toCharArray()) 
    count[c - 'a']++; 
+0

'a'代表增強for循環方法中的內容? – Tloz

+1

@Tloz'a'的整數值從當前字符(c)中減去,因此訪問計數數組的右邊索引,例如, 'a' - 'a'=索引0,'b' - 'a'= 1等 – m13r

1

你可能要考慮使用Map。一個Map讓你一塊與其他數據的關聯,所以,如果你可以做類似的東西:

Map<Character, Integer> characterCount = new LinkedHashMap<>(); 

Integer currentCount = characterCount.get('a'); 
if(currentCount == null) { 
    currentCount = 0; 
} 
characterCount.put('a', currentCount++); 

這比使用數組作爲其他人所說wordier了一點,但它是如果有很多更靈活你不再想在後面的某個地方使用char

2

相反聲明26個不同int變量的,聲明長度26的一個int陣列這裏所有的元素被自動初始化爲0。

int[] letterCounts = new int[26]; 

然後,不是26的情況下,利用這樣的事實,該優點這些字母的數字值都是按數字順序排列的。如果你從你的字母中減去'a',你會得到一個從0到25的值,代表你需要的索引。然後,你可以說:

letterCounts[charphrases[iii] - 'a']++; 

根據您的要求,您可能需要單獨處理的其他字符,比如大寫字母,數字和/或標點符號。

然後你可以遍歷你的數組內容,加入'a'來重現字母,並打印出合適的數組元素。

0

我使用Map爲您製作了一個程序。檢查出來:

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) { 
     Map<Character, Integer> map = new HashMap<Character, Integer>(); 
     System.out.println(map); 
     String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
     for(char c : alphabet.toCharArray()) 
      map.put(c, 0); 
     addString("Hello World", map); 
     System.out.println(map); 
    } 

    public static void addString(String s, Map<Character, Integer> m){ 
     s = s.toLowerCase().replace(" ", ""); 
     for(char c : s.toCharArray()) 
      m.put(c, m.get(c) + 1); 
    } 
} 
+0

如果字符串中包含ü等字符會怎麼樣? – Jeffrey

+0

您只需更新'alphabet'來包含您想要錄製的字符。但是,是的,我應該嘗試一下,或者測試地圖中的值是否爲空。 – mjkaufer

0

我已經改善mjkaufers回答,這是你可以做任何計數字符(包括UTF-8和特殊字符)內容:

import java.util.HashMap; 
import java.util.Map; 

public class Main { 
    public static void main(String[] args) { 
     Map<Character, Integer> map = new HashMap<Character, Integer>(); 
     countCharacters("Hello World", map); 
     System.out.println(map); 
    } 

    public static void countCharacters(String s, Map<Character, Integer> m) { 
     s = s.replace(" ", ""); // do not count spaces 

     // if you only want to count lower case characters: 
     // s = s.toLowerCase(); 

     for (char c : s.toCharArray()) { 
      int cnt = (m.get(c) == null) ? 0 : m.get(c); 
      m.put(c, cnt + 1); 
     } 
    } 
} 
相關問題