2014-03-29 50 views
0

我試圖將二維字符數組中的所有字母轉換爲數字。作爲結果,我想要a = 0,b = 1,c = 2,... z = 25。java字符轉換爲二維字符數組中的數字

然後,我想這是我的代碼部分:

char [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}}; 

for (int i = 0; i < letters.length; i++) { 
      for (int j = 0; j < letters[i].length; j++) { 
       if (letters[i][j] >= 'a' && letters[i][j] <= 'z') { 
        letters[i][j] = (char) ((letters[i][j] - 'a') + '0'); 
       } 
      } 
     } 

我的代碼的結果是不是我之前的預期。

從'a'到'j',它運作良好。但是,從'k'到'z'它沒有打印預期的數字。

我的代碼有什麼問題?

+1

請顯示字母的聲明以及它是如何填充的。 – OldProgrammer

+0

請解釋你爲什麼要進行字符算術:'((字母[i] [j] - 'a')+'0')' – aliteralmind

+0

那麼你的問題是你正在創建字符的ASCII碼數字符號。 ascii表沒有10個或更多的數字。所以當你得到數字10時,結果可能是: – Asthor

回答

2

首先,您不能將數字10存儲爲單個字符。它是兩個字符,1和0.所以結果數組必須是別的字符數組。如果它是int你的工作,那麼你可能是最好的將它們存儲在一個int數組中。

intarray[i][j] = (letters[i][j] - 'a');其中intarray是與char數組具有相同大小的int值的數組。其他選項是如果必須將結果存儲在同一個數組中並將其轉換爲數字,然後將其轉換爲字符串,則創建一個字符串數組。像這樣

String [][] letters = {{"i", "u"}, {"a", "g"}, {"e", "k"}}; 

for (int i = 0; i < letters.length; i++) { 
    for (int j = 0; j < letters[i].length; j++) { 
     if (letters[i][j].charAt(0) >= 'a' && letters[i][j].charAt(0) <= 'z') { 
      letters[i][j] = Integer.toString((letters[i][j].charAt(0) - 'a'); 
     } 
    } 
} 

原因是ascii表只有數字0到9作爲符號。所以在你的情況下,你會得到前10個字母進行轉換,但在此之後,你開始在ascii表中獲得各種符號。 k例如是:,l是; m是<等等。當你將字符轉換爲數字時,你最好將它們作爲int來使用,因爲它們更容易進行數學運算。

你可以做同樣的事情,而不必將它轉換爲int,但這意味着你需要找出字符 - 'a'大於10。如果是這樣,你需要得到的數字除以10,然後模數數字,並給他們每個相關的ASCII符號,使他們成爲一個字符串。這要複雜得多,很難做到,特別是考慮只要用整數就可以輕鬆實現。

還有其他兩種選擇,但我仍然覺得上面的字符串選項是最簡單的。

首先將2d數組作爲int。然後,您可以將整數初始化爲字母。然後你可以對它們進行算術運算,找到它們適合的數字。像這樣:

int [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}}; 

for (int i = 0; i < letters.length; i++) { 
    for (int j = 0; j < letters[i].length; j++) { 
     if (letters[i][j] >= 'a' && letters[i][j] <= 'z') { 
      letters[i][j] = (letters[i][j] - 'a'); 
     } 
    } 
} 

這會產生同樣的效果。這樣做的問題在於打印實際的字母會花費更多的精力,最後您需要將其轉換爲字符。所以我不會推薦這種方式。

第二種選擇是將所有的char值存儲在char數組中。像這樣:

char [][] letters = {{'i', 'u'}, {'a', 'g'}, {'e', 'k'}}; 

for (int i = 0; i < letters.length; i++) { 
    for (int j = 0; j < letters[i].length; j++) { 
     if (letters[i][j] >= 'a' && letters[i][j] <= 'z') { 
      letters[i][j] = (char) (letters[i][j] - 'a'); 
     } 
    } 
} 

要打印這個,那麼你需要將char轉換爲int。所以,你可以用打印出來:

for (int i = 0; i < letters.length; i++) { 
    for (int j = 0; j < letters[i].length; j++) { 
     System.out.printf("%d\n", (int) letters[i][j]); 
    } 
} 

那麼這將工作很好,但它是一個有點哈克,你需要確保你投你的字符爲int所有的時間。到目前爲止,我認爲字符串數組是最好的選擇,但它取決於你的目標是什麼。但是你不能做的一件事就是將char'10'存儲在char數組中,因爲'10'不是一個字符,而是兩個字符,並且不適合字符。

+0

你是否介意解釋OP的路線,假設它有意義? '字母[i] [j] =(char)((字母[i] [j] - 'a')+'0');'字符算術是我不熟悉的東西。它是打算作爲連接? – aliteralmind

+0

對於字母a到j(前10個字母)它是有意義的。 @aliteralmind原因是Char'a' - 'a'+'0'給了我們97 - 97 + 48的ascii表。 Ascii符號48是0.所以結果將是字符'0'。然而k是107,所以公式是107-97 + 48,它給了我們58在ascii表或58中的符號58。 – Asthor

+0

感謝您的澄清。不完全清楚,但我明白了。 – aliteralmind