Я хочу использовать коллекцию вместо 2D-массива, поэтому мне не нужно указывать ее размер во время объявления, и я могу добавить столько элементов, сколько хочу динамически.
Какую коллекцию использовать вместо 2D-массива в Java?
Ответ 1
Проблема с List > заключается в том, что вам нужно переназначить каждую строку, если вы хотите переназначить свою матрицу.
Если вы хотите использовать разреженную матрицу или, возможно, бесконечную матрицу, вы можете сделать что-то вроде:
class SparseMatrix<X> {
private Map<Coord, X> values = new HashMap<Coord, X>();
public SparseMatrix() {
}
public X get(int x, int y) {
return values.put(new Coord(x,y)); // null if there no value
}
public void set(int x, int y, X value) { // you can use null (like in a List)
values.set(new Coord(x,y), value);
}
private static class Coord {
int x; int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object other) {
if (other instance of Coord) {
Coord o = (Coord) other;
return o.x == x && o.y == y;
}
return false;
}
@Override
public int hashCode() {
return o.x + o.y; // or some more clever implementation :)
}
}
}
Изменить: Apache Commons HashCodeBuilder - отличный инструмент для генерации хэш-кодов.
Ответ 2
Самый простой способ - использовать вложенные коллекции... скажем (если ваши значения - это строки) List<List<String>>
, которые затем можно использовать следующим образом:
List<List<String>> fakeArray = new ArrayList<List<String>>();
// Pretend you fill it with values between these calls
String retrieve = fakeArray.get(0).get(0);
Edit: Первоначально это был Map<String,List<String>>
, который в этом контексте не имеет смысла.
Однако вы можете увидеть, если Коллекции Google или Коллекции Apache Commons имеют нечто более специализированное, которое вы можете использовать.
Ответ 3
Что вы хотите с этим сделать? Я бы, вероятно, просто использовал Collection<Collection<Element>>
(где Collection может быть заменен List).
Или вы можете создать свой собственный класс с методами, чтобы перебирать строки или столбцы или все элементы по мере необходимости.
Ответ 4
Я лично использую Vector класс для этой цели, хотя разные требования могут в конечном итоге диктовать использование других, более специализированных классы.
Ответ 5
java.util.ArrayList - мой предпочтительный выбор.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
Ответ 6
Импорт java.util.ArrayList;
ArrayList
- это то, что вы хотите, вам не нужно устанавливать его размер во время создания, и вы можете динамически добавлять элементы, используя метод add
.
Ответ 7
Это зависит от того, что вы пытаетесь сделать, но я бы порекомендовал ArrayList. Это быстрее, чем Вектор. Если вы не заботитесь о синхронизации! Если вы хотите, чтобы это было двухмерным списком, вы создаете ArrayList, и каждый элемент этого списка будет другим ArrayList.
Ответ 8
Вы можете сделать пробную версию с ArrayList
с ArrayList
в качестве элементов. Если это не делает то, что вы хотите, это даст вам уверенность в том, что вам нужно построить самостоятельно.
Ответ 9
Это зависит от того, как вы хотите использовать структуру данных. Ваши варианты:
- Два списка; это ваша работа для синхронизации между ними.
- Карта; вместо отношения "ключ-значение" ваши записи в карте будут просто кортежами объектов.
- Список массивов объектов с 2 ячейками; каждый элемент в списке будет массивом объектов размером 2.
EDIT: Я совершенно неправильно понял вопрос; Я думал, что речь идет о двумерном массиве шириной 2.
Правильно прочитав вопрос (надеюсь:-)), я согласен с теми, кто сказал список списков.