2016-08-12 5 views
0

Мне нужно получить три уровня вниз в список массивов. Вот мой код о том, как создать конечный продукт «rowList»:Получить строку из ArrayList внутри ArrayList внутри ArrayList

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

неоднократные звонки в 'Integer.parseInt (rs.getString («Id»))' очень лишними ... –

+0

Когда я говорю, я получаю string array, я имею в виду, если я запустил это: rowList.get (0) .get (0) .toString(); то я получаю это: [Свойство1, Свойство2, Свойство3, Свойство4]. Это помогает? –

+0

Можете ли вы показать код, который заполняет 'rowList'? –

ответ

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<>(); 
+0

Это работает, но вам не хватает одного> прямо перед rowList. Как только я подтвержу, я отвечу вас как правильный ответ. –

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.Вы должны использовать дженерики, чтобы указать тип объекта в «рядах»:

ArrayList<ArrayList<ArrayList<String>>> rowList = new ArrayList<>(); 

Как вы видите здесь, дженерики могут быть использованы в качестве типа внутри любой <> так же, как вы уже сделали для крайнего уровня ArrayList в вашем оригинальном коде. (Обратите внимание, что в JDK 7+, вы можете использовать оператор алмазного при создании ArrayList. Это значительно уменьшает дублирование информации о типе, который уже появляется в объявлении.)

еще лучше, вы можете объявлять переменные, используя интерфейс List для того, чтобы обеспечить некоторую гибкость в конкретном типе используемого:

List<List<List<String>>> rowList = new ArrayList<>();