2017-04-15 46 views
0

說,我有類似這樣的數組,把數組項到HashMap中有2串

{"A", "1", "B", "2", "C", "3"} 

我希望把它放到HashMap像對,我試過一些方法,但沒有一個似乎工作。 我創建了一個方法ISDIGIT(),以檢查是否一個項目是數字,

private static boolean isDigit(String str){ 
    try { 
     Integer.parseInt(str); 
    } 
    catch (NumberFormatException nfe){ 
     return false; 
    } 
    return true; 
} 

然後我試圖分離成2陣列,數字和字母。

for (int i = 0; i <= parts.length; i++) { 
    if (isDigit(parts[i])) { 
     numbers[i] = parts[i]; 
    } else { 
     abcs[i] = parts[i]; 
    } 
} 

最後,

for (int i = 0; i < numbers.length ; i++) { 
    map.put(abcs[i], numbers[i]); 
} 

,我打印出來帶,

for (String each: map.keySet()) { 
    System.out.println(each + ":" + map.get(each)); 
} 

它打印類似,

1 
A : null 
2 
B : null 

它應該打印是,

A : 1 
B : 2 
C : 3 
+0

「A」1「B」2「C」3「不是數組。 –

+0

'isDigit(」10「)'會返回true,但10不是數字,'isInteger'會是一個更好的名字 – weston

+1

你讓它變得更加困難(而且速度更慢),爲什麼不迭代原始數組,將當前元素和下一個元素添加到地圖中,然後將2添加到循環計數器?for(int i = 0;我

回答

2

爲什麼不通過parts中成對2小號迭代通過增加循環計數器:

for (int i = 0; i < parts.length -1; i += 2) { 
    map.put(parts[i], parts[i + 1]); 
} 
+0

已經嘗試過,如果我這樣做,'map.get(「A」);',打印'2 \ n B'。 –

+0

我不認爲你會這樣做,因爲你必須開始跟蹤迭代,這是不常見的。雖然此選項可能有效,但它不會通過代碼審查。 –

+0

您需要發佈創建陣列的代碼位。這聽起來像是問題。 ''2 \ n B「'必須在數組中才能發生。 – weston

1

您不一致地遍歷數組。

for (int i = 0; i <= parts.length; i++) { 
    if (isDigit(parts[i])) { 
     numbers[i] = parts[i]; 
    } else { 
     abcs[i] = parts[i]; 
    } 
} 

假設ISDIGIT()的行爲,您要創建兩個陣列,但是當你創建他們,他們是不是爲了。所以當我== 0,isDigit(parts [0])是假的,所以你創建abcs [0] = parts [0],但你在abcs中創建的下一個項目不是abcs [1],它是abcs [2],因爲當它是一個數字時,你跳過了1。

2

問題是與你的for循環:

for (int i = 0; i <= parts.length; i++) { 
    if (isDigit(parts[i])) { 
     numbers[i] = parts[i]; 
    } else { 
     abcs[i] = parts[i]; 
    } 
} 

你迭代從0到5,所以發生的事情是要放置valies成指數由1偏移它是這樣的:ABCS [0] - >數字[1] - > abcs [2] - <數字[3]。更簡單的解決方案是使用列表並使用add方法。

+0

同意。在這裏使用列表會更好。 –

0

有索引你的情況的問題。雖然看輸入類型有其他方法(One such way is mentioned in an another answer)來做到這一點,但我正在編輯你的代碼,以便它可以按照你的意圖工作。

int inputLength = parts.length; // assuming it is always even as it contains a pair (alphabet, number) 
int[] numbers = new int[inputLength/2]; 
char[] abcs = new char[inputLength/2; 

int keyIndex = 0; 
int valueIndex = 0; 

for (int i = 0; i <= parts.length; i++) { 
    if (isDigit(parts[i])) { 
     numbers[keyIndex] = parts[i]; 
     keyIndex++; 
    } else { 
     abcs[valueIndex] = parts[i]; 
     valueIndex++; 
    } 
} 
0

正如答案Your iterating over the array unevenly中提到的那樣,問題出在循環索引。 但我想指出的是,您在方法中以錯誤的方式使用異常處理isDigit(String str) 對控制流使用異常處理被認爲是不好的做法。一個很好的答案關於這個話題的問題是在這裏:Exceptions as control flow 我會重構你的方法是這樣的:

private static boolean isDigit(String str){ 
    if (Character.isDigit(str.charAt(0))) { //assuming that the length of str is always 1 
     return true; 
    } 
    return false; 
} 

希望這有助於。

+0

字符串的長度並不總是1. –

+0

好的,那麼你可以使用正則表達式。 ''isDigit' method body:'return str.matches(「[ - +]?\\ d * \\。?\\ d +」);'它會考慮像「120」或「0012」或「00.45」爲有效數字。可能你會調整正則表達式來滿足你的具體需求。無論如何,我的主要想法是通知你,作爲控制流的異常處理是反模式。 –