Я работаю над классом разреженных матриц, который должен использовать массив LinkedList
для хранения значений матрицы. Каждый элемент массива (т.е. каждый LinkedList
) представляет собой строку матрицы. И каждый элемент в LinkedList
массиве представляет столбец и сохраненное значение.
В моем классе у меня есть объявление массива как:
private LinkedList<IntegerNode>[] myMatrix;
И в своем конструкторе SparseMatrix
я пытаюсь определить:
myMatrix = new LinkedList<IntegerNode>[numRows];
Ошибка, которую я получаю, это
Невозможно создать общий массив из
LinkedList<IntegerNode>
.
Итак, у меня есть две проблемы:
- Что я делаю не так и
- Почему тип приемлем в объявлении для массива, если он не может быть создан?
IntegerNode
это класс, который я создал. И все мои файлы классов упакованы вместе.
class IntegerNodeList extends List<IntegerNode> {}
По какой-то причине вам нужно привести тип и сделать объявление следующим образом:
источник
Помимо проблем с синтаксисом, мне кажется странным использовать массив и связанный список для представления матрицы. Чтобы иметь возможность получить доступ к произвольным ячейкам матрицы, вам, вероятно, понадобится фактический массив или, по крайней мере,
ArrayList
для хранения строк, так как онLinkedList
должен проходить весь список от первого элемента до любого конкретного элемента,O(n)
операция, в отличие от многих быстрееO(1)
сArrayList
или фактическим массивом.Поскольку вы упомянули, что эта матрица является разреженной, возможно, лучший способ хранить данные - это карта карт, где ключ в первой карте представляет индекс строки, а его значение - карта строки, ключи которой являются индексом столбца , со значением вашего класса IntegerNode. Таким образом:
Если вам нужно иметь возможность перемещаться по матрице строка за строкой, вы можете сделать карту строк типом a
TreeMap
, и то же самое для обхода столбцов в порядке индекса, но если вам не нужны эти случаи,HashMap
это быстрее, чемTreeMap
. Конечно, были бы полезны вспомогательные методы для получения и установки произвольной ячейки, обрабатывающие неустановленные нулевые значения.источник
источник
приведение такого способа работает, но по-прежнему оставляет вам неприятное предупреждение:
«Безопасность типов: выражение типа List [] требует неконтролируемого преобразования ..»
это умная идея, чтобы избежать предупреждения. может быть, немного лучше использовать для этого интерфейс:
затем
компилируется без предупреждений.
не так уж плохо выглядит, правда?
источник
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
Это тонкая, но важная проблема. Можно только положитьIntegerNodeList
в массив.myMatrix[i] = new ArrayList<IntegerNode>();
кинетArrayStoreException
.Никаких предупреждений. NetBeans 6.9.1, jdk1.6.0_24
источник
В Java 1.5 (или 1.6, насколько я могу судить) нет универсального создания массива. См. Https://community.oracle.com/message/4829402 .
источник
Если я сделаю следующее, я получу соответствующее сообщение об ошибке
Но если я просто удалю тип списка в объявлении, он, похоже, имеет желаемую функциональность.
Эти два заявления сильно отличаются друг от друга, о чем я не знаю?
РЕДАКТИРОВАТЬ
А, думаю, я столкнулся с этой проблемой сейчас.
Кажется, что перебор матрицы и инициализация списков в цикле for работают. Хотя это не так идеально, как некоторые другие предлагаемые решения.
источник
Вам нужен массив List, одна из альтернатив - попробовать:
Затем
node_array[i]
сохраняет головной (первый) узелArrayList<IntegerNode>
илиLinkedList<IntegerNode>
(независимо от вашей любимой реализации списка).При такой схеме вы теряете метод произвольного доступа
list.get(index)
, но тогда вы все равно можете перемещаться по списку, начиная с хранилища узлов head / fist в массиве типов.Это может быть приемлемым выбором дизайна в зависимости от вашего варианта использования. Например, я использую этот дизайн для представления списка смежности графа, в большинстве случаев это требует обхода списка смежности для данной вершины вместо произвольного доступа к какой-либо вершине в списке.
источник