2010-07-14 111 views
8

這是不好的做法嗎?堆疊仿製藥

ArrayList<ArrayList<ArrayList<Double>>> list = new ArrayList<ArrayList<ArrayList<Double>>>(); 
+0

它讓我的頭受傷,但據我所知它被認爲是可以接受的。 – 2010-07-14 15:08:47

+2

在你的例子中,你如何定義不良習慣? – 2010-07-14 15:09:04

+0

很明顯,這是一個不好的做法。 – 2010-07-14 15:17:27

回答

4

這不一定是壞習慣。這只是「不可讀」。有一點耐心,在即將到來的Java 7中你允許構建參數化類型時,可以省略的克魯夫特在特定的泛型類型:

List<List<List<Double>>> list = new ArrayList<>(); 

這就是所謂的type inference

截至目前,如果你可以用編譯器警告過,你也可以只是這樣做的:

List<List<List<Double>>> list = new ArrayList(); 
+0

我想你也可以創建一個看起來像'public static 列表 createArrayList()'的工廠方法,然後調用它而不是構造函數。類型推斷將自動確定基於分配類型。 – Mike 2010-07-14 18:27:57

+0

或只使用Guava的'Lists'類,並用'Lists.newArrayList()'替換構造函數調用。這正是邁克所提出的。 – whiskeysierra 2010-07-14 22:07:58

2

那麼,你需要一個列表,其元素是列表的元素是列表?除非您告訴我們,否則我們不知道您要完成什麼。

但是,直接使用ArrayList而不是List確實是一種不好的做法。

+0

您絕對是對的,謝謝。不知道爲什麼我沒有做清單開始。 – rhombidodecahedron 2010-07-14 16:30:01

1

取決於你打算如何使用它。也許你可以封裝二維列表並以List<TwoDimensionalList<Double>>結束。據推測,這將有TwoDimensionalList.get(int i, int j)等操作獲取i列表中j位置的元素。

編輯:如果它不是二維列表的列表,而是一個三維列表,那麼當然你想要一個ThreeDimensionalList。 (如果您的列表尺寸是固定的,您可以在內部使用單個數組(列表)來實現此功能,其中元素(i,j,k)位於i*dim1 + j*dim2 + k*dim3位置)。

7

這是一個基於ArrayList的三維矩陣。不好看,但這就是我們必須寫的。

另一種可能是:

List<List<List<Double>>> list = new ArrayList<List<List<Double>>>(); 

這是一個有點短,通常在大多數情況下,你只是在接口中的方法有興趣的確定。

所以如果你需要一個可調整大小的三維矩陣數據結構,那麼這是一個乾淨的方法。

4

這可能是一個好主意,創建一個新的類來處理您試圖完成的行爲。我將創建一個使用私有ArrayList<...>(贊成繼承的委派)的類並創建必要的方法。如果有的話,它應該讓事情更容易閱讀和理解。

0

至少,更明確地命名它,類似3dList,會有所幫助。 對我來說,首選的是編寫一個2D/3D列表的自定義封裝,正如其他人在上面提出的那樣。

+0

不錯的建議,但在Java中,標識符不能以數字開頭。發明更好的東西;) – BalusC 2010-07-14 16:23:58

+0

ThreeDimensionalList? ThreeDList? – whiskeysierra 2010-07-14 22:10:40

3

肯定。最有可能你的代碼更好用double[][][]

+0

這可能是一個更好的選擇,如果你打算使用一個三維的雙精度數組,因爲如果不是稀疏數組,Double對象的ArrayLists的ArrayLists的ArrayList可能會佔用更多的空間。 – 2010-07-14 18:56:21

+0

一般而言,你是對的。 Java程序員經常低估對象引入的內存開銷。但是,如果您需要矩陣可實時調整大小,並且事先知道尺寸變化很難預先預測,那麼您可能需要使用「堆疊或泛型」方法。特別是因爲與C不同,數組不能在Java中動態調整大小。 – rtperson 2010-07-14 19:36:04