2013-01-31 37 views
0

我有一個包含產品價格對的二維對象數組(Object [] [] data)
我嘗試通過以下方式將這些值傳遞給Map。將包含double的對象轉換爲字符串,然後回到雙倍

private String myPairs = ""; 
private String[] l, m; 

for (int i=0; i<data.length; i++){ 
    myPairs += (String)data[i][0] + ":" + String.valueOf(data[i][1]) + ","; 
} 

Map<String, Double> pairs = new java.util.HashMap<>(); 
l = myPairs.split(","); 

for (int i=0; i<l.length; i++){ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 

我得到一個java.lang.ArrayIndexOutOfBoundsException。我做了什麼錯誤?

+0

哪一行,你得到'ArrayIndexOutOfBound',還去通過你的調試器,你可以自己解決問題.. :) – PermGenError

+0

上? line pairs.put((String)m [0],...) – Stanos

+1

what con對象數據中的tains? – alnasfire

回答

2

嘗試

for (int i=0; i<l.length-1; i++){ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 
+0

提供一些解釋可能會有所幫助(否則,人們可能會誤解/不理解(也可能是倒向投票,如發生在此處))。 – Dukeling

1

當第一個for循環結束後,你已經與分離所有對「」並在最後一個額外的「」。所以,l.length是對數加1。儘管如此,這應該不會產生錯誤。

問題是,當你在':'上分割每一對時,l的最後一個元素等於一個空白字符串。 因此,分割產生一個1元素數組,包含一個空白字符串。發生錯誤的原因是您要求m[1]

不要在對的最後一個元素後面添加',',應該解決問題。

我希望這有助於:)

1

, S中分裂的最後一個元素是空的(因爲你說在第一循環的最後一次迭代+ ","),所以跳過在第二循環中的最後一個元素。

for (int i = 0; i < l.length-1; i++) 
{ 
    m = l[i].split(":"); 
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));    
} 

還要注意的是,如果提供的字符串中包含: S或, S,你的算法可能會拋出異常了。

注 - 一種更好的方式(和避免以上)也只是做到這一點在第一循​​環中,是這樣的:

for (int i = 0; i < data.length; i++) 
{ 
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
} 
2

您的問題就在這裏:

pairs.put((String)m[0], Double.parseDouble((String)m[1])); 

第一個for循環創建一個以,結尾的字符串。例如"foo:0.1,bar:0.2,"

然後,你分裂了,。因此,上述示例將返回["foo:0.1"; "bar:0.2"; ""]。請注意由於字符串的最後一個,而導致的空字符串值。

最後,對於每個值,您拆分:。它適用於前兩個值(即["foo"; "0.1"]["bar"; "0.2"]),但最後一個值將是一個1值數組,其中包含一個空字符串:[""]

當試圖訪問數組的第二個值(即索引1,因爲數組是基於0的索引)時,會拋出ArrayIndexOutOfBoundsException


幾種解決方案:

在第一循環中,把一個條件添加,與否:

myPairs += (i == 0 ? "" : ",") + (String)data[i][0] + ":" + String.valueOf(data[i][1]); 

只是你的第一個循環後,取出的最後一個字符該字符串:

myPairs = myPairs.substring(0, myPairs.length() - 1); 

在第二循環中,不要去,直到最後的價值,但只有等到N-1之一:

​​

OR甚至更​​好,只有當你不需要串你正在建設中的第一環表示,將更換所有代碼:上

for (int i=0; i<data.length; i++) { 
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
} 
相關問題