2014-11-25 152 views
0

我創建了包含隨機生成的不同位置數值的2D數組列表。Java - 從2D數組列表中讀取數據時遇到問題

public static int Prices[][] = new int[Cities.length][ItemNames.length]; 
public static List<int[][]> CityPrices = new ArrayList<int[][]>(); 
public static void NewDay() 
{ 
    for(int i = 0; i<Cities.length; ++i) 
    { 
     Prices[i] = PriceGenerator.ReturnPricesForCity(i); 
     //This method returns an array of random integers 
    } 
    CityPrices.add(Prices); 
} 

但後來當我要找回歷史價格爲順利通過了天量的特定項目,它返回每天

int Prices[] = new int[GlobalVariables.CityPrices.size()]; 
String sTest = ""; 
for(int i = 0; i < Prices.length; ++i) 
{ 
    Prices[i] = GlobalVariables.CityPrices.get(i)[spinCity.getSelectedItemPosition()][spinItem.getSelectedItemPosition()]; 
    sTest = sTest + Prices[i] + ","; 
} 

相同的值在這種情況下,值由sTest返回的是:6055,6055,6055,6055,6055,連續五天。 如果我會例如添加一天,值將更改爲新數字的範圍,在這種情況下爲:7294,7294,7294,7294,7294,7294,

請告訴我我是什麼做錯了,因爲在過去的4天裏我一直試圖找出這一個,但沒有運氣。

+1

問題可能出在產生隨機值的方法上。 – jhamon 2014-11-25 13:52:17

+0

你可以發表你如何生成隨機數的代碼嗎?它看起來可能與僞隨機數發生器 – RockOnRockOut 2014-11-25 13:52:41

+0

有關。另外,您可能會誤用2D陣列 – jhamon 2014-11-25 13:54:40

回答

1

您的CityPrices列表中的每個元素都是相同的:在每種情況下,您都要添加Prices二維數組。您的循環修改了Prices[i],但它不會更改Prices,它仍然是對同一個二維數組的引用。

我想你想象它會通過在其當前狀態的數組的內容,但它不會:它通過一個參考到陣列的.add()方法,所以任何的後續變更陣列將反映在CityPrices的內容中。

如果你的循環結束時,你嘗試

CityPrices.get(0) == CityPrices.get(1) 

你會看到它返回true

+0

赫赫謝謝,我認爲它可能是這樣的結果,但不想相信它,因爲我不知道什麼代替。我最近決定擰它,並創建列表中的每個項目包含在二維數組,我花了幾個小時,但至少現在一切工作正常... – Christian 2014-11-27 15:31:02

+0

@Christian很高興你得到它的工作:) – 2014-11-27 16:03:16

0

在作業中:Prices[i] = GlobalVariables.CityPrices.get(i)[spinCity.getSelectedItemPosition()][spinItem.getSelectedItemPosition()];您基本上在相同索引處引用了兩個維度的int[][]

最重要的是,spinCity.getSelectedItemPosition()調用可能會在循環的每次迭代中返回相同的索引,因此您的值相同。

因爲您還沒有發佈spinCity的代碼,所以很難假設任何東西。

+0

嘿謝謝你的建議,spincity是指在接口上創建的一個微調,它基本上是android的下拉列表,並且該方法返回當前選定項目的索引的整數值,並且它應該每次返回相同的索引循環,因爲我想改變的唯一的東西應該是從列表中檢索的數組 – Christian 2014-11-27 15:15:43