2016-02-27 69 views
0

調試的我的代碼和所有的變量顯示爲預期:的ArrayList的add()修改1項,增加了空條目

class1 { 

    callingMethod() { 
     Double[] entry = new Double[size]; 

     while(condition) { 
      for (i over entry) { 
       entry[i] = Double.parseDouble(token.nextToken()); 
      } 

      DataSet.addInput(entry); 
     } 
    } 
} 


DataSet { 
    private ArrayList<Double[]> inputsList; 

    public DataSet (...) { 

     list = new <Double[]>ArrayList(); 
    } 

    public void addInput(Double[] anInputVector) { 
     inputsList.add(anInputVector); 
    } 

} 

「theEntry」被正確填充雙打的陣列,每一個新的條目。當每個新條目添加到「列表」中時,第一個列表條目將用新的雙值修改,並添加一個空條目。結果是1st條目是一個雙精度數組(最後添加),後面是一長串空值。 任何想法?

+2

請發表您的實際代碼。這甚至不會編譯,就我所知,不能產生你描述的錯誤行爲。 –

+0

我增加了更多。整個代碼?這是一個相當大的尺寸,你想要這一切嗎? – vv111y

回答

2

看起來是共享數組對象的一種情況。舉個例子:

List<double[]> list = new ArrayList<>(); 

double[] a = new double[] { 1.0, 2.0 }; 
double[] b = new double[] { 3.0, 4.0 }; 

// Three new's: three objects. 

list.add(a); 
list.add(a); 
list.add(b); 

a[0] = 5.0; 
list.get(0)[1] = 6.0; 

// list: [ [5.0, 6.0]==a, [5.0, 6.0]==a [3.0, 4.0]==b ] 

一個解決方案:

public void addEntry(Double[] theEntry) { 
    list.add(Arrays.copyOf(theEntry, theEntry.length)); 
} 
+1

或者在OP僞代碼的當前迭代中,每次在while(condition)循環中創建一個新數組。 –

+0

@MattiVirkkunen是的,這可能會更靈活;當人們知道傳遞的數組沒有被進一步使用時。 –

+0

@MattiVirkkunen是的工作。感謝你和Joop。我沒有意識到這一點 - 我認爲是一個引用參考的問題。 – vv111y