我需要将三个级别放入数组列表中。以下是我如何创建最终产品“rowList”的代码:
ArrayList<ArrayList> rowList = new ArrayList<ArrayList>();
ArrayList<ArrayList<String>> appList =new ArrayList<ArrayList<String>>();
ArrayList<String> arr = new ArrayList<String>();
int Id = -1;
int cc = rsmd.getColumnCount();
while(rs.next()){
if(Id == -1){
arr.add(rs.getString("name"));
Id= Integer.parseInt(rs.getString("Id"));
}
if(Id!= Integer.parseInt(rs.getString("Id"))){
Id= Integer.parseInt(rs.getString("Id"));
rowList.add(appList);
appList = new ArrayList<ArrayList<String>>();
arr.add(rs.getString("name"));
}
for(int i=2; i < rsmd.getColumnCount();i++){
arr.add(rs.getString(rsmd.getColumnName(i)));
}
appList.add(arr);
arr = new ArrayList<>();
}
rowList.add(appList);
所以最后rowlist看起来像这样:
[0]
[0]
[0]Property 1
[1]Property 2
[2]Property 3
[1]
[0]Property 1
[1]Property 2
[2]Property 3
[1]
[0]
[0]Property 1
[1]Property 2
[2]Property 3
[1]
[0]Property 1
[1]Property 2
[2]Property 3
所以我的问题是如何到达属性,嵌套数组的最后一级?我可以使用rowList.get(0).get(0).toString()来返回字符串数组,但是rowList.get(0).get(0).get(0)不起作用,而是给出了错误:找不到符号。
我还希望能够在检索到属性并将其设置为字符串后删除它。这部分很容易解决,所以它并不重要。
答案 0 :(得分:3)
这是因为您使用的是原始类型:
ArrayList<ArrayList> rowList = new ArrayList<ArrayList>();
rowList.get(0)
会返回ArrayList
。 Antoher .get(0)
将返回Object
,因为您使用的是原始类型。 Object
没有get
方法。
但Object
确实有toString
方法,因此您可以致电toString
。
您只需更改声明即可。使用钻石可以更容易:
ArrayList<ArrayList<ArrayList<String>>> rowList = new ArrayList<>();
ArrayList<ArrayList<String>> appList = new ArrayList<>();
ArrayList<String> arr = new ArrayList<>();
答案 1 :(得分:2)
好的,让我们考虑链式调用rowList.get(0).get(0).get(0)
中每个结果的类型。最简单的方法是将每个调用分成它自己的行,这样我们就可以找出变量声明所需的类型。首先,看看rowList
:
ArrayList<ArrayList> rowList = new ArrayList<ArrayList>();
这告诉我们rowList.get(0)
将返回ArrayList
:
ArrayList arr = rowList.get(0);
现在rowList.get(0).get(0)
相当于arr.get(0)
。但这会返回Object
:
Object obj = arr.get(0);
因此rowList.get(0).get(0).get(0)
相当于obj.get(0)
。但是,Object
没有名为get()
的方法。这就是您收到错误消息的原因。
通常,在链接方法调用时应该非常小心。通常,此语法仅在方法返回对调用对象的引用时使用。这样返回类型总是相同的,并且更容易跟踪。当每个连续的方法调用返回类型不同时,可能很难跟踪。
问题是ArrayList
返回的rowList.get(0)
是原始类型。因此,另一个get()
调用仅返回Object
。您应该使用泛型来指定&#34;行&#34;:
ArrayList<ArrayList<ArrayList<String>>> rowList = new ArrayList<>();
正如您在此处看到的那样,泛型可以用作任何<>
内部的类型,就像您在原始代码中对ArrayList
的最外层一样。 (请注意,在JDK 7+中,您可以在创建ArrayList
时使用菱形运算符。这极大地减少了重复声明中已出现的类型信息。)
更好的是,您可以使用List
接口声明变量,以便在使用的具体类型中提供一些灵活性:
List<List<List<String>>> rowList = new ArrayList<>();