Вы не можете использовать универсальное создание массива. Это - дефект / функция дженериков Java.
пути без предупреждений:
Используя Список Списков вместо Массива Списков:
List< List<IntegerNode>> nodeLists = new LinkedList< List< IntegerNode >>();
Объявление специального класса для Массива Списков:
class IntegerNodeList {
private final List< IntegerNode > nodes;
}
По некоторым причинам необходимо бросить тип и сделать объявление как это:
myMatrix = (LinkedList<IntegerNode>[]) new LinkedList<?>[numRows];
Кроме проблем синтаксиса, для меня кажется странным использовать массив и связанный список для представления матрицы. Чтобы быть в состоянии получить доступ к произвольным ячейкам матрицы, Вы, вероятно, хотели бы, чтобы фактический массив или по крайней мере ArrayList
содержал строки, поскольку LinkedList
должен пересечь целый список от первого элемента до какого-то конкретного элемента, O(n)
операция, в противоположность намного более быстрому O(1)
с ArrayList
или фактический массив.
, Так как Вы упомянули, эта матрица редка, тем не менее, возможно, лучший способ хранить данные как карта карт, где ключ в первой карте представляет индекс строки, и его значение является картой строки, ключи которой являются индексом столбца со значением, являющимся Вашим классом IntegerNode. Таким образом:
private Map<Integer, Map<Integer, IntegerNode>> myMatrix = new HashMap<Integer, Map<Integer, IntegerNode>>();
// access a matrix cell:
int rowIdx = 100;
int colIdx = 30;
Map<Integer, IntegerNode> row = myMatrix.get(rowIdx); // if null, create and add to matrix
IntegerNode node = row.get(colIdx); // possibly null
, Если необходимо быть в состоянии пересечь матричную строку строкой, можно заставить строку отобразить тип a TreeMap
и то же для того, чтобы пересечь столбцы в индексном порядке, но если Вам не нужны те случаи, HashMap
более быстро, чем TreeMap
. Вспомогательные методы добраться и установить произвольную ячейку, обрабатывая нулевые значения сброса, были бы полезны, конечно.
Нет никакого универсального создания массива в Java 1.5 (или 1.6, насколько я могу сказать). См. https://community.oracle.com/message/4829402.
myMatrix = (LinkedList
[]) новый LinkedList [numRows];
приведение этого способа работает, но по-прежнему оставляет вас с неприятным предупреждением:
"Тип безопасность: выражение типа List [] требует неконтролируемого преобразования .. "
Объявление специального класса для массива списков:
class IntegerNodeList {частные конечные узлы List
; }
- отличная идея, чтобы избежать предупреждения. может быть, лучше использовать для этого интерфейс:
public interface IntegerNodeList extends List<IntegerNode> {}
, затем
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
компилируется без предупреждений.
выглядит неплохо, правда?