Как я могу добавлять и обновлять данные в случайном порядке в двумерной матрице в Java - PullRequest
0 голосов
/ 08 ноября 2019

например, ввод: (строка, столбец, вес), например (0,2,10,0), (1,2,3,0), (2,1,11,3), (1,2, 15,0)

результат должен быть:

0 1 2

0. ,10,0

1. ,15.0

2. 11.3.

(данные будут вставлены и обновлены )

Я заметил, что это не может быть сделано простоиспользуя add (index i, элементы e) или set () метод, предоставленный Arraylist в Java. Потому что он будет выдавать : IndexOutOfBoundsException - если индекс выходит за пределы диапазона (index <0 || index> size ()) , например, когда я пытаюсь вставить (0,2,5.0) после вставки (0,0,3.0).

1 Ответ

0 голосов
/ 08 ноября 2019

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

private final List<List<Double>> matrix = new ArrayList<>();

public OptionalDouble set(int i, int j, double value) {
    while (i >= matrix.size()) matrix.add(new ArrayList<>());
    List<Double> row = matrix.get(i);
    while (j >= row.size()) row.add(null);
    Double old = row.set(j, value);
    return (old == null) ? OptionalDouble.empty() : OptionaDouble.of(old);
}

public OptionalDouble get(int i, int j) {
    List<Double> row = (i < matrix.size()) ? matrix.get(i) : Collections.emptyList();
    Double value = (j < row.size()) ? row.get(j) : null;
    return (value == null) ? OptionalDouble.empty() : OptionalDouble.of(value);
}

Это можетдовольно плохо работают с большими матрицами из-за всех созданных здесь объектов и плохой локальности ссылок.

Если возможно, непрерывный массив примитивных double элементов будет лучше для больших плотных наборов данных.

...