Java / P5:如何声明一个包含FloatLists的Arraylists数组?

时间:2016-10-27 15:36:55

标签: java arrays arraylist processing

如果我可以声明一个FloatLists数组:FloatList [][] values = new FloatList[3][3];

为什么不像这样声明一个包含FloatLists的ArrayLists数组:ArrayList<FloatList> [][] values = new ArrayList<FloatList>() [3][3];?或者偶然:ArrayList<FloatList> [][] values = new ArrayList<FloatList> [3][3]();

如何实现这一目标?是否很难引用埋藏在其硬壳质地下的floats

3 个答案:

答案 0 :(得分:2)

从最内层类型到最外层类型。您从FloatList开始:

FloatList

然后将其包装在ArrayList

ArrayList<FloatList>

然后你需要一个数组:

ArrayList<FloatList>[]

或2D数组:

ArrayList<FloatList>[][]

它为您提供声明的类型,但是您必须通过为变量赋值来初始化变量。从数组开始,给它一个大小:

ArrayList<FloatList>[] array = new ArrayList[10];

这为您提供了一组ArrayList<FloatList>个对象,但它们的开头为null。要为它们提供值,您需要遍历数组中的每个索引,并使用new关键字将索引的值设置为ArrayList<FloatList>的实例:

for(int i = 0; i < array.length; i++){
   array[i] = new ArrayList<FloatList>();
}

对于2D数组,只需在嵌套的for循环中使用相同的逻辑。

然后在数组的特定索引处向FloatList添加ArrayList,您可以这样做:

array[i].add(new FloatList());

最后,要将float添加到数据中索引的FloatList中的ArrayList,您可以这样做:

array[x].get(y).append(0.5);

要从数组中索引的float FloatList中的索引中获取ArrayList,您可以这样做:

float f = array[x].get(y).get(z);

总而言之,它看起来像这样:

ArrayList<FloatList>[] array = new ArrayList[10];

for(int i = 0; i < array.length; i++){
   array[i] = new ArrayList<FloatList>();
}

array[1].add(new FloatList());

array[1].get(0).append(0.25);
array[1].get(0).append(0.5);
array[1].get(0).append(0.75);

float f = array[1].get(0).get(2);

println(f);

答案 1 :(得分:1)

ArrayList

基本上,您声明您想要的对象是ArrayList的3D数组,而不是生成实际的values[0][0] = new ArrayList<>(); 个对象。

之后,你必须实例化每一个,例如:

dependencies {
    compile 'org.restlet.jse:org.restlet:2.3.7'
    compile 'org.restlet.jse:org.restlet.ext.jsslutils:2.3.7'
}

等等。

答案 2 :(得分:0)

由于JVM提供泛型的方式,它不起作用。 Java中的泛型是一种前端编译器功能,它在执行时成为原始类型用法和强制转换。

使用泛型时编译器在做什么?

这是一个非常人为的例子。让我们说我想创建一个List<String>来存储命令行参数,我稍后会用它来启动一个新进程,如下所示:

List<String> cmd = new ArrayList<>();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = cmd.get(0)+" "+cmd.get(1)+" "+cmd.get(2);

在编译时,编译器将检查以确保每次我通过String使用通用List方法时使用cmd类型,如果我尝试则抛出错误使用不兼容类型的实例。但是,在编译期间,执行之前会发生一个名为擦除的小事。有效地,编译器将上面的代码转换成如下代码:

List cmd = new ArrayList();
cmd.add("java");
cmd.add("-jar");
cmd.add("path/to/my.jar");
...
String args = (String)cmd.get(0)+" "+(String)cmd.get(1)+" "+(String)cmd.get(2);

那么为什么我的通用数组代码没有编译?

在您的示例中,您希望创建一个泛型类型的数组,如下所示:

ArrayList<FloatList>[][] array = new ArrayList<FloatList>[n][m]; //Doesn't compile? What gives?

问题是,由于类型擦除,ArrayList<FloatList>类类型确实不存在,现在您已经要求JVM创建一个不存在的二维数组类型。

好的,那么替代方案是什么?

嗯......它不漂亮,但你可以这样做:

class ArrayListOfFloatList extends ArrayList<FloatList>{
    ...
}

//Somewhere else in your code:
ArrayListOfFloatList[][] myArray = new ArrayListOfFloatList[n][m];
//This will compile because ArrayListOfFloatList is a real class.

唯一的另一种方法是不使用数组。或许很难看,但不幸的是,它目前是如何实现Java的限制。