2010-07-14 109 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