从ArrayList内的ArrayList内的ArrayList中获取String

时间:2016-08-12 18:47:21

标签: java string arraylist

我需要将三个级别放入数组列表中。以下是我如何创建最终产品“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)不起作用,而是给出了错误:找不到符号。

我还希望能够在检索到属性并将其设置为字符串后删除它。这部分很容易解决,所以它并不重要。

2 个答案:

答案 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<>();