Какой тип коллекции я должен использовать для этой проблемы Java? - PullRequest
1 голос
/ 15 июня 2011

Я хотел бы иметь двумерный массив, который содержит только целые числа.Координаты также являются целыми числами.

Проблема в следующем:

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

Пример:

Предполагая, что первое число будет 2, помещенное в (3;2).Я хочу иметь возможность просто добавить 8, например, так: array.add(8,2,1);

_ _ _ _      _ _ _ _
_ _ _ _  =>  _ _ 8 _
_ _ _ 2  =>  _ _ _ 2

Я уже нашел что-то, что действительно работало, но это действительно тяжело.Это

Hashtable<Integer, Hashtable<Integer, Integer>>

Кто-нибудь видит более изощренный способ сделать это?Я не очень хорош в коллекциях.

Ответы [ 7 ]

3 голосов
/ 15 июня 2011

Может быть, вы могли бы использовать таблицу из гуавы Это предоставляет вам table.put (R rowKey, C columnKey, V value)

Таблица гуавы

2 голосов
/ 15 июня 2011

В этом случае вам понадобятся классы на заказ. Как насчет определения класса Cell:

public class Cell implements Comparable<Cell> {
    public int row;
    public int col;

    public Cell() {
        this(0, 0);
    }

    public Cell(int row, int col) {
        this.row = row;
        this.col = col;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + this.row;
        result = prime * result + this.col;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instance of Cell))
            return false;
        Cell cell = (Cell) obj;
        return this.row == cell.row && this.col == cell.col;
    }

    //Define ordering for cells
    @Override
    public int compareTo(Cell cell) {
        int compare = cell.row - this.row;
        if (compare == 0)
            compare = cell.col - this.col;
        return compare;
    }
}

А затем класс Grid, который расширяет TreeMap для поддержания логического порядка ячеек:

import java.util.TreeMap;

public class Grid extends TreeMap<Cell, Integer> {
    public Integer get(int row, int col) {
        return this.get(new Cell(row, col));
    }

    public Integer put(int row, int col, Integer value) {
        return this.put(new Cell(row, col), value);
    }
}
1 голос
/ 15 июня 2011

Разве вы не можете просто создать хеш-карту со строковым ключом и сохранить любое желаемое числовое значение? То есть

Map<String, Integer> m = new HashMap<String,Integer>();
m.put(makeKey(3,2), 2); // where makeKey returns something like "[3,2]"

РЕДАКТИРОВАТЬ:

Недостатком является то, что у вас нет надежного порядка итераций, т. Е. Если вы хотите перебирать все в N-й строке или столбце, простого способа сделать это просто не существует.

1 голос
/ 15 июня 2011

Создайте класс, который соответствует вашим потребностям. Или, лучше, создайте интерфейс, который объявляет методы, в которых вы хотите использовать класс. В вашем коде обратитесь к типу интерфейса.

В реализации интерфейса я бы использовал ArrayList<ArrayList<Integer>>. Перед чтением или назначением номера просто проверьте, действительны ли координаты. Если нет, вы должны иметь возможность предварительно заполнить массив нулевым значением (или другим значением, отличным от числа) перед установкой или чтением значения.

0 голосов
/ 15 июня 2011

Список целочисленных списков будет работать.

List<List<Integers>

Вы можете указывать значение строки и столбца через индекс.

0 голосов
/ 15 июня 2011

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

0 голосов
/ 15 июня 2011

Выезд TIntIntHashMap в Trove . Эти коллекции Trove очень хороши.

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