Какую коллекцию использовать вместо 2D-массива в Java?

Я хочу использовать коллекцию вместо 2D-массива, поэтому мне не нужно указывать ее размер во время объявления, и я могу добавить столько элементов, сколько хочу динамически.

Ответ 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 класс для этой цели, хотя разные требования могут в конечном итоге диктовать использование других, более специализированных классы.

Ответ 6

Импорт java.util.ArrayList;

ArrayList - это то, что вы хотите, вам не нужно устанавливать его размер во время создания, и вы можете динамически добавлять элементы, используя метод add.

Ответ 7

Это зависит от того, что вы пытаетесь сделать, но я бы порекомендовал ArrayList. Это быстрее, чем Вектор. Если вы не заботитесь о синхронизации! Если вы хотите, чтобы это было двухмерным списком, вы создаете ArrayList, и каждый элемент этого списка будет другим ArrayList.

Ответ 8

Вы можете сделать пробную версию с ArrayList с ArrayList в качестве элементов. Если это не делает то, что вы хотите, это даст вам уверенность в том, что вам нужно построить самостоятельно.

Ответ 9

Это зависит от того, как вы хотите использовать структуру данных. Ваши варианты:

  • Два списка; это ваша работа для синхронизации между ними.
  • Карта; вместо отношения "ключ-значение" ваши записи в карте будут просто кортежами объектов.
  • Список массивов объектов с 2 ячейками; каждый элемент в списке будет массивом объектов размером 2.

EDIT: Я совершенно неправильно понял вопрос; Я думал, что речь идет о двумерном массиве шириной 2.

Правильно прочитав вопрос (надеюсь:-)), я согласен с теми, кто сказал список списков.