Как мне реализовать вложенный ArrayList? - PullRequest
4 голосов
/ 08 ноября 2010

Я хочу реализовать структуру данных, которая выглядит примерно так:

{{RowID, N1, N2, N3},
 {RowID, N4, N5, N6},
 {RowID, N7, N8, N9}}

И так далее.Это в основном таблица в Java с 3 столбцами и RowID.Какую структуру данных я должен использовать и как ее реализовать, как в коде?

Ответы [ 6 ]

12 голосов
/ 08 ноября 2010

Составьте ArrayList из ArrayLists. E.g.:

ArrayList<ArrayList> arrayListOfLists = new ArrayList<ArrayList>();
arrayListOfLists.add(anotherArrayList);
//etc...
6 голосов
/ 08 ноября 2010

Есть несколько вариантов. Один из способов - объявить класс, представляющий строку.

 public class MyRow{
     private long rowId;
     private int col1;
     private int col2;
     private int col3;
     //etc
 }

Очевидно, вы выбираете подходящие типы данных и имена переменных.

Затем вы можете создать ArrayList этого типа:

   List<MyRow> rows = new ArrayList<MyRow>();

Это особенно полезно, если количество столбцов не будет меняться.

2 голосов
/ 08 ноября 2010

Предполагая, что RowID является длинным, а данные столбца являются двойными, я реализовал бы эту конструкцию следующим образом: import java.util.HashMap; import java.util.Map; ... Map<Long, Double[]> table = new HashMap<Long, Double[]>();

Чтобы сохранить строку: Long rowID = 1234L; table.put(rowID, new Double {0.1, 0.2, 0.3});

Чтобы получить доступ к строке: Double[] row = table.get(rowID);

Замените Double [] на любой тип данных, который вы хотите Int [], String [], Object [] ...

Вы можете просмотреть эти данные с помощью итератора:import java.util.Iterator; import java.util.Map.Entry; ... Iterator<Entry<Long, Double[]>> iter = table.entrySet().iterator(); while (iter.hasNext()) { Entry entry = iter.next(); rowID = entry.getKey(); row = entry.getValue(); };

Чтобы выполнить итерацию данных в порядке ввода данных, используйте LinkedHashMap вместо HashMap.

2 голосов
/ 08 ноября 2010

Вы можете использовать Map<Integer, ArrayList<MyObject>>, где ключом к карте будет ваш RowID.

1 голос
/ 08 ноября 2010

Я бы создал объект EJB, содержащий данные для каждой строки. Это имеет преимущество перед «вложенным списком ArrayList», поскольку члены данных строго типизированы.

Далее, я бы вставил эти бины в Список, возможно, в LinkedList, если вы заранее не знаете их количество. Если это так, я бы переключился на ArrayList.

Если порядок не важен, вы можете вместо этого использовать HashSet или HashMap, в зависимости от того, выполняете ли вы их только итерацию (Set) или вам нужно выполнить поиск ключей по RowID (Map). Если вы используете одну из этих структур данных, вам нужно переопределить equals() и hashCode() для вашего компонента.

0 голосов
/ 07 октября 2014

Java обеспечивает приведение списка, например, вы можете сделать это следующим образом:

ArrayList<List<someObject>> ArrayListOfLists = new ArrayList<List<someObject>>();
...