2013-02-04 111 views
0

這裏是我的代碼到一個數組方法:如何簡化這個數組方法?

private int _a; 

public static void main(String[] args) {} 

public int[] countAll(String s) { 
    int[] xArray = new int[27]; 
    int[] yArray = new int[27]; 
    _a = (int)'a'; 

    for (int i = 0; i < xArray.length; i++) { 
     xArray[i] = _a; 
     _a = _a++; 
    } 

    for (int j = 0; j < s.length(); j++) { 
     s = s.toLowerCase(); 
     char c = s.charAt(j); 
     int g = (int) c; 
     int letterindex = g - yArray[0]; 
     if (letterindex >= 0 && letterindex <= 25) { 
      xArray[letterindex]++; 
     } else if (letterindex < 0 || letterindex > 25) { 
      xArray[26]++; 
     } 
    } 
    return xArray; 
} 

此代碼Java編寫,但有人告訴我,有一個簡單的方法。我在計算我的代碼的簡化版本時遇到了很多麻煩。請幫幫我。

+5

如果你告訴我們它會做什麼會有所幫助。 –

+2

對於一件事'_a = _a ++;'與'_a ++相同;' –

+1

另一件事,你是否需要在for循環中每次調用它:「s = s.toLowerCase();」 – mike01010

回答

0

下面是應使你的代碼中有兩處重要改進:

  • 添加一個方法的Javadoc countAll,使讀者不必通過20+行的腫脹代碼進行逆向工程,蒐羅什麼方法是應該是

  • 擺脫_a憎惡。根據最廣泛接受的Java編碼標準,下劃線字符在變量名中沒有位置。此外,a是我遇到的最沒用的字段名稱。如果它打算向讀者傳達一些意思......你完全失去了我。

    (哦,我明白了,這不應該是一個領域都沒有。Bzzzt !!!)


再有就是yArray陣列。至於我可以告訴它使用的唯一的地方是在這裏:

int letterindex = g - yArray[0]; 

這實際上是相同的:

int letterindex = g; 
因爲 yArray[0]

從未分配到。總之yArray是完全多餘的。


這:

if (letterindex >= 0 && letterindex <= 25) { 
     xArray[letterindex]++; 
    } else if (letterindex < 0 || letterindex > 25) { 
     xArray[26]++; 
    } 

else部分的條件是多餘的。如果您只是編寫此代碼,您的代碼將更容易閱讀:

if (letterindex >= 0 && letterindex <= 25) { 
     xArray[letterindex]++; 
    } else { 
     xArray[26]++; 
    } 

這兩者是等效的。你明白爲什麼?


最後,xArray元素的初始化對我來說顯然是錯誤的。如果xArray包含計數,則元素需要從零開始。 (難道你沒有想過爲什麼你的代碼是告訴你,字符串包含很多「ZEES」的?)

「此代碼在Java ......」

我不這麼認爲。也許它編譯。也許它運行時不會崩潰。但它給出正確的答案!

+0

@StephenC ..您還可能指出將'_a ++'的結果重新分配給'_a'的副作用。 –

2

如果你想要做的就是算上下的情況下,這是做的很婉轉地,什麼是錯的東西,如:

public static int countUpper(String str) 
{ 
    int upper = 0; 
    for(char c : str.toCharArray()) 
    { 
     if(Character.isUpperCase(c)) 
     { 
      upper++; 
     } 
    } 
    return upper; 
} 

然後,只需與Character.isLowerCase(c)同樣的事情相反。

+1

爲什麼要用'Character.isLetter'檢查?這只是多餘的。 –

+0

我認爲OP要爲每個字母計數,而不僅僅是一個計數。 – Dukeling

0

它看起來像你的程序試圖找到字符串中的不同字母的頻率,並且你正在計算特殊索引26中的非字母。在這種情況下,你的初始化計數的代碼是錯誤的。它得到了一些值以下的for循環預初始化:

for (int i = 0; i < xArray.length; i++) { 
     xArray[i] = _a; 
     _a = _a++; 
    } 

我認爲該方法可以簡單地這樣的:

s = s.toLowerCase(); 
int histogram[] = new int[27]; 

for (char c: s.toCharArray()) { 
    int index = c - 'a'; 

    if (index < 0 || index > 25) { 
     index = 26; 
    } 

    histogram[index]++; 
} 
1
public static int[] countAll(String s) { 
    int[] xArray = new int[27]; 

    for (char c : s.toLowerCase().toCharArray()){ 
     if (Character.isLetter(c)) 
      xArray[c -'a']++; 
     else 
      xArray[26]++; 
    } 

    return xArray; 
} 
+0

你會得到一個數組索引越界。所有越界角色必須放置在索引26(從我能說的)。可以肯定的是轉換爲'int'是不必要的。 – Dukeling

+0

你是對的,修好了。 –

0
public static int[] countAll(String s) { 
    int[] count = new int[26]; 

    for (char c : s.toLowerCase().toCharArray()) { 
     if ('a' <= c && c <= 'z') { 
      count[c - 'a']++; 
     } 
    } 

    return count; 
} 

首先..你的陣列,其中大。

第二..你爲什麼需要兩個數組呢?

三..你的代碼沒有seemt工作..單詞「hello」返回數組數97(26倍)和數字102

編輯:製造更短。