Не может создать массив LinkedLists в Java …?

99
задан Radiodef 8 April 2015 в 18:53
поделиться

5 ответов

Вы не можете использовать универсальное создание массива. Это - дефект / функция дженериков Java.

пути без предупреждений:

  1. Используя Список Списков вместо Массива Списков:

    List< List<IntegerNode>> nodeLists = new LinkedList< List< IntegerNode >>();
    
  2. Объявление специального класса для Массива Списков:

    class IntegerNodeList {
        private final List< IntegerNode > nodes;
    }
    
63
ответ дан glmxndr 24 November 2019 в 05:00
поделиться

По некоторым причинам необходимо бросить тип и сделать объявление как это:

myMatrix = (LinkedList<IntegerNode>[]) new LinkedList<?>[numRows];
140
ответ дан Paul Bellora 24 November 2019 в 05:00
поделиться

Кроме проблем синтаксиса, для меня кажется странным использовать массив и связанный список для представления матрицы. Чтобы быть в состоянии получить доступ к произвольным ячейкам матрицы, Вы, вероятно, хотели бы, чтобы фактический массив или по крайней мере 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. Вспомогательные методы добраться и установить произвольную ячейку, обрабатывая нулевые значения сброса, были бы полезны, конечно.

5
ответ дан Dov Wasserman 24 November 2019 в 05:00
поделиться

Нет никакого универсального создания массива в Java 1.5 (или 1.6, насколько я могу сказать). См. https://community.oracle.com/message/4829402.

2
ответ дан fracz 24 November 2019 в 05:00
поделиться

myMatrix = (LinkedList []) новый LinkedList [numRows];

приведение этого способа работает, но по-прежнему оставляет вас с неприятным предупреждением:

"Тип безопасность: выражение типа List [] требует неконтролируемого преобразования .. "

Объявление специального класса для массива списков:

class IntegerNodeList {частные конечные узлы List ; }

- отличная идея, чтобы избежать предупреждения. может быть, лучше использовать для этого интерфейс:

public interface IntegerNodeList extends List<IntegerNode> {}

, затем

List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];

компилируется без предупреждений.

выглядит неплохо, правда?

3
ответ дан 24 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: