Какую коллекцию использовать вместо 2D-массива в Java? - PullRequest
13 голосов
/ 12 января 2010

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

Ответы [ 9 ]

7 голосов
/ 12 января 2010

Проблема со списком> заключается в том, что вам нужно переразмерять каждую строку, если вы хотите переразмерить матрицу.

Если вы хотите использовать разреженную матрицу или, возможно, бесконечную матрицу, вы можете сделать что-то вроде:

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's 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 - отличный инструмент для генерации хеш-кодов.

4 голосов
/ 12 января 2010

Самый простой способ - использовать вложенные коллекции ... скажем (при условии, что ваши значения являются строками) 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);

Редактировать: Первоначально это был Map<String,List<String>>, который на самом деле не имеет смысла в этом контексте.

Однако, возможно, вы захотите узнать, есть ли у Коллекции Google или Коллекции Apache Commons нечто более специализированное, чем вы можете использовать.

2 голосов
/ 12 января 2010

Что вы хотите с этим делать? Я, вероятно, просто использовал бы Collection<Collection<Element>> (где Collection может быть заменен List).

Или вы можете создать свой собственный класс с методами для итерации по строкам или столбцам или всем элементам по мере необходимости.

0 голосов
/ 12 января 2010

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

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

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

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

0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

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

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

0 голосов
/ 12 января 2010

java.util.ArrayList - мой предпочтительный выбор.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

0 голосов
/ 12 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...