2013-06-22 64 views
3

這是我的情況,我想爲我正在處理的3d項目創建一個矩陣緩衝區。如何使用ArrayList和Array編寫三維矩陣

很多人對堆棧溢出提議做這樣

ArrayList<ArrayList<object>> 

然而事情這個結構是造成問題,因爲我需要一個固定大小的矩陣和我知道的影響是add(i,object)作爲對的複雜性操作。另一方面,我的矩陣的最後一個嵌套層次需要具有可變大小,所以如果對象位於相同位置,它只會將其自身添加到堆棧中。

回答

2

如果你需要一個長度可變的第三維矩陣,爲什麼不做ArrayList [] []?

顯然,你不能實例化一個通用的矩陣,但可以從原始類型強制轉換爲Object(假設這是你想要的)是這樣的:

ArrayList<Object>[][] box = (ArrayList<Object>[][])new ArrayList[length][width]; 

這將導致一個固定大小具有可變長度第三維的矩陣。不過要記住用ArrayList填充矩陣,因爲整個矩陣將被填充爲null。

+0

好鑄造聽起來像一個可能的解決方案。我目前正在做類似的事情,但我沒有投射。我覺得應該有更好的解決辦法嗎?是不是有一個類似於數組的結構對象? –

+0

與數組(即列表)類似的集合是LinkedList,ArrayList和Vector。 ArrayList優於Vector,並且通常ArrayList比LinkedList具有更快的訪問速度,並且使用的內存少得多,所以它通常是您想要的。如果你對這個第三維有更多具體的約束,比如只在前面或後面添加,你可以使用ArrayDeque或Stack,除此之外你真的使用ArrayList。 –

1

可變長度第三維可以由許多不同的集合處理。如果你的第三維真的像一個堆棧(或者甚至是一個Queue/Deque),那麼我會使用LinkedList來處理它,因爲它可以從集合的正面/背面添加和移除對象的速度。

爲了創建類型的列表E你可以寫的二維矩陣:

LinkedList<E>[][] matrix = new LinkedList[length][width]; 

然後之後,我會建議實例的所有名單,像這樣爲了防止空指針問題:

for(int i = 0; i < matrix.length; i++) 
    for(int j = 0; j < matrix[0].length; j++) 
     matrix[i][j] = new LinkedList<>(); 

我假設你正在使用的Java 7,如果沒有,乾脆把類型(E)到尖括號實例的每個元素時。我希望這可以幫助,並有趣的編碼! =)