2012-11-03 29 views
0

我不知道如何做一個char數組的數組,甚至更糟糕的是,它是一個「掃描儀」(System.in)的數組。我將解釋:一個字符數組,這是一個數組的數組,它是一個掃描器(Java)

1 = A, J, S. 
2 = B, K, T. 
3 = C, L, U. 
4 = D, M, V. 
5 = E, N, W. 
6 = F, O, X. 
7 = G, P, Y. 
8 = H, Q, Z. 
9 = I, R. 

我想輸入一個名稱,並從每個字母接收(輸出)相應的數字。但我不知道該怎麼做。例如:

Ericson = 5993165. 

但我不希望有一個完整的電話號碼,我想每個數字是一個完全獨立的指數,因爲我想「計算的名字」。

下面是我試圖未經掃描器的一個示例:

public static void main(String[] args) { 

    int[][] arrays = new int[9][3]; 

} 

凡9陣列的每個索引是一個字符數組與3個字母。也許我在以完全錯誤的方式思考。

我非常感謝您的關注!

編輯:

我的實驗是這樣的:

public static void main(String[] args) { 
    char[][][][] Array1 = {{{{1},{'A'},{'J'},{'S'}}}}; 
    char[][][][] Array2 = {{{{2},{'B'},{'K'},{'T'}}}}; 
    char[][][][] Array3 = {{{{3},{'C'},{'L'},{'U'}}}}; 
    char[][][][] Array4 = {{{{4},{'D'},{'M'},{'V'}}}}; 
    char[][][][] Array5 = {{{{5},{'E'},{'N'},{'W'}}}}; 
    char[][][][] Array6 = {{{{6},{'F'},{'O'},{'X'}}}}; 
    char[][][][] Array7 = {{{{7},{'G'},{'P'},{'Y'}}}}; 
    char[][][][] Array8 = {{{{8},{'H'},{'Q'},{'Z'}}}}; 
    char[][][] Array9 = {{{9},{'I'},{'R'}}}; 
    System.out.println('E'+'R'+'I'+'C'+'S'+'O'+'N'); 
} 

這比我以前的想法好,但我覺得我還遠。 (再次,主要問題是:這個「ericson」需要是掃描器,因爲名稱不是一個明確的變量,它可能是任何東西)。

+2

你舉的例子其實並不是一個例子的話,那就是你剛纔定義的數組的數組。你有什麼試圖真正解決你的問題? –

+0

您需要某種文件IO - 就像緩衝式讀取器或某些網絡材料一樣。掃描儀非常適合你的嘗試。只需將每行從String轉儲到一個ArrayList中,如下所示:someString.toCharArray() –

回答

0

你想要一個字符,爲什麼你不聲明數組爲炭

public static void main(String[] args) { 

char[][] arrays = new char[][] { 
    { 'A', 'J', 'S' }, 
    { 'B', 'K', 'T' }, 
    { 'C', 'L', 'U' }, 
    { 'D', 'M', 'V' }, 
    { 'E', 'N', 'W' }, 
    { 'F', 'O', 'X' }, 
    { 'G', 'P', 'Y' }, 
    { 'H', 'Q', 'Z' }, 
    { 'I', 'R', '*' } 
} ; 

} 

然後有一個嵌套的循環,通過數組去找到這封信,並返回行號+ 1,因爲它從0開始 然後把號碼+ 1的ArrayList

ArrayList<int> myArr = new ArrayList<int>(); 
myarr.add(i); 

任何arraylist就像一個數組,但它沒有固定的s ize,你可以繼續添加它。這使所有數字都是單獨的而不是整體。

+0

非常感謝您使用RandomGuy。非常有用!我仍然在思考如何結合「char [] []」,「for」,「ArrayList」和「BufferedReader」來解決我的問題。 –

+0

「ArrayList 」給我以下錯誤: 「令牌上的語法錯誤」int「,在此令牌之後預期的尺寸」 我發現「ArrayList」僅與字符串有關的示例,並且我理解您說的和我真的需要一個「ArrayList 」。 –

+0

我需要查看代碼才能知道爲什麼會出現錯誤。 – RandomGuy

0

我會說,是的,讓我們停下來,看看這個完全不同的方式。

1)那些多維數組佔用空間,並不是創建查找表的最有效方式 - 這就是您將要使用的表。
2)查找表由容易計算的算法定義,以'A'開始,每個字母的值爲1-9。範圍1-9在到期時重複。
3)這需要能夠處理來自Scanner的任何類型的字符串輸入,並分別檢查字符串中的每個字母。

這裏是我的總碼建議:

String incomingString = "Ericson"; 

String outputValue = ""; 
for (int i = 0; i < incomingString.length(); i++) { 
    int numberRepresentation = incomingString.charAt(i); 

    if (numberRepresentation >= 'a') { 
     numberRepresentation -= 'a'; 
    } else if (numberRepresentation >= 'A') { 
     numberRepresentation -= 'A'; 
    } 

    numberRepresentation = (numberRepresentation % 9) + 1; 

    outputValue += numberRepresentation; 
} 

說明(S):

1)迭代了整個字符串:

for (int i = 0; i < incomingString.length(); i++) { 
    int numberRepresentation = incomingString.charAt(i); 

    // other code here 

} 

我們incomingString變量包含我們將要進行計算的字符串。我們在字符串中的每個字符上創建一個for循環,將給定字符的整數值存儲到變量numberRepresentation中。該整數值是ASCII/Unicode表格中它存在的位置的數量。
優化/擴展:每次需要計算任何String length()方法調用,可以將其提取到循環外的常量。

2)規格化字符:

// other code above 
    if (numberRepresentation >= 'a') { 
     numberRepresentation -= 'a'; 
    } else if (numberRepresentation >= 'A') { 
     numberRepresentation -= 'A'; 
    } 
    // other code below 

正如你可能(或可能不)知道,字符文字可以作爲與他們的ASCII表中值的整數。這部分代碼檢查字符是否小寫(大於或等於'a'的值)或大寫字母(大於或等於'A'的值)。通過減去'a'或'A'的值,存儲在numberRepresentation中的數字是字符與字母表中'a'的距離。
優化/擴展:這些檢查僅確認字符至少是'a'或'A',它不檢查字符實際上是否爲字母,如果不是字母則應拋出錯誤。另外,如果使用某些字符方法,可讀性可以提高。

3)應用個性變換:

// other code above 
    numberRepresentation = (numberRepresentation % 9) + 1; 
    // other code below 

這是實際的工作就完成了:每個標準化字符值的模數和(9)被計算可能值的數目。由於這些結果將爲0-8,因此我們在結果中添加一個以使可能的範圍1-9。
優化/擴展:值9是一個常數,因此應該提取到本地命名變量。這也將允許編碼根據需要改變,即如果你喜歡1-5編碼。在行尾刪除「+ 1」可以使「0」成爲可能的輸出值。

4)追加到運行輸出:

// other code above 
    outputValue += numberRepresentation; 
    // other code below 

這裏,我們的新的價值被連結到目前正在建設的字符串,完成時,應該是我們計算的字符串。
優化/擴展:由於該字符串串聯發生在循環內,因此係統將不斷地爲新的String對象創建/分配空間。這種浪費可以通過使用StringBuilder對象來組合一系列計算字符來避免。

擴展:最重要的是,如果這段代碼將要被多次使用,它肯定應該被提取到一個方法中,以便它可以被輕鬆訪問。


完成的代碼與實現的所有擴展:

public static String calculateName(String incomingString) throws Exception { 
    StringBuilder outputBuilder = new StringBuilder(); 

    final int encodingRange = 9; 
    final int limit = incomingString.length(); 
    for (int i = 0; i < limit; i++) { 
     int numberRepresentation = incomingString.charAt(i); 

     if (!Character.isLetter(numberRepresentation)) { 
      throw new Exception("Incorrect String format"); 
     } 

     if (Character.isLowerCase(numberRepresentation)) { 
      numberRepresentation -= 'a'; 
     } else { 
      numberRepresentation -= 'A'; 
     } 

     numberRepresentation = (numberRepresentation % encodingRange) + 1; 

     outputBuilder.append(numberRepresentation); 
    } 

    return outputBuilder.toString(); 
} 
相關問題