Какая структура данных наиболее подходит для реализации двумерного массива в Java? - PullRequest
7 голосов
/ 26 марта 2009

Я хочу реализовать нечто вроде двумерного массива.

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

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

Также количество строк будет равно количеству столбцов; это исправлено, потому что одинаковые имена будут даны как для строк, так и для столбцов.

Я также хочу пройти через эту двумерную структуру данных, как через карту.

Ответы [ 4 ]

7 голосов
/ 26 марта 2009

Звучит так, как будто вы хотите использовать клавишу строки, клавишу col, а затем значение в этом месте. Нет встроенной структуры данных, которая сделает это за вас.

Самым простым в использовании может быть двухмерный массив для реальных данных. Используйте что-то вроде следующего, чтобы перейти от имени строки или столбца к фактическому индексу в вашем массиве. Добавьте столько привязок имени к индексу, сколько хотите.

Map<String, Integer> rows = new HashMap<String, Integer>();
Map<String, Integer> cols = new HashMap<String, Integer>();

Тогда получим это значение в сетке ...

grid[rows.get("Row name")][cols.get("Column name")];

Поместите сетку и метод get(String rowName, String colName) в класс, если вы хотите более чистый API.

Редактировать: Я вижу, что вопрос был обновлен, и похоже, что пары имя-индекс одинаковы для строк и столбцов. Итак, вот обновленная версия:

class SquareMap<V> {
    private V[][] grid;
    private Map<String, Integer> indexes;

    public SquareMap(int size) {
        grid = (V[][]) new Object[size][size];
        indexes = new HashMap<String, Integer>();
    }

    public void setIndex(String name, int index) {
        indexes.put(name, index);
    }

    public void set(String row, String col, V value) {
        grid[indexes.get(row)][indexes.get(col)] = value;
    }
    public V get(String row, String col) {
        return grid[indexes.get(row)][indexes.get(col)];
    }
}
1 голос
/ 26 марта 2009

(редактирование на основе комментария)

Если размер определяется во время выполнения, это не проблема. Это может работать:

final int[][]              data;
final int                  size;
final Map<String, Integer> names;

// code that sets the size variable
names = new HashMap<String, Integer>();
data  = new int[size][size];

names.put("ID-A", 0);
names.put("ID-B", 1);

data[names.get("ID-A")][names.get("ID-A")] = 39;
data[names.get("ID-A")][names.get("ID-B")] = 40;
data[names.get("ID-B")][names.get("ID-A")] = 41;
data[names.get("ID-B")][names.get("ID-B")] = 42;
0 голосов
/ 28 июня 2009

Вы можете просто использовать карту как

class TwoDArray<V> implements Iterable<Map.Entry<Point, V>> {
    private final Map<Point, V> map = new LinkedHashMap<Point, V>();
    public V set(int x, int y, V value) {
       return map.put(new Point(x,y), value);
    }
    public V get(int x, int y) {
       return map.get(new Point(x, y));
    }
    public Iterator<Map.Entry<Point, V>> iterator() {
       return map.entrySet().iterator();
    }
}

// to iterate
TwoDArray<Double> twoDArray = new TwoDArray();
twoDArray.set(3, 5, 56.0);
twoDArray.set(-1000, 5, 123.4);
twoDArray.set(789012345, -100000000, -156.9);
for(Map.Entry<Point, Double> entry: twoDArray) {
  //
}
0 голосов
/ 26 марта 2009

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

class TwoDimArray {
    public int[][] createArray(int nRows, int nCols) {
        return new int[nRows][nCols];
    }
    public int[][] resizeArray(int[][] oldArray, int nRows, int nCols) {
        int[][] newArray = new int[nRows][nCols];
        for (int i=0; i<Math.min(oldArray.length, nRows); ++i)
            for (int j=0; j<Math.min(oldArray[i].length, nCols); ++j)
                newArray[i][j] = oldArray[i][j];
        return newArray;
    }
}
...