Estoy trabajando en una clase de matriz dispersa que necesita usar una matriz de LinkedList
para almacenar los valores de una matriz. Cada elemento de la matriz (es decir, cada uno LinkedList
) representa una fila de la matriz. Y cada elemento de la LinkedList
matriz representa una columna y el valor almacenado.
En mi clase, tengo una declaración de la matriz como:
private LinkedList<IntegerNode>[] myMatrix;
Y, en mi constructor para SparseMatrix
, trato de definir:
myMatrix = new LinkedList<IntegerNode>[numRows];
El error que termino recibiendo es
No se puede crear una matriz genérica de
LinkedList<IntegerNode>
.
Entonces, tengo dos problemas con esto:
- ¿Qué estoy haciendo mal y
- ¿Por qué el tipo es aceptable en la declaración de la matriz si no se puede crear?
IntegerNode
es una clase que he creado. Y todos mis archivos de clase están empaquetados juntos.
class IntegerNodeList extends List<IntegerNode> {}
Por alguna razón, debe lanzar el tipo y hacer la declaración de esta manera:
fuente
Aparte de los problemas de sintaxis, me parece extraño usar una matriz y una lista vinculada para representar una matriz. Para poder acceder a celdas arbitrarias de la matriz, probablemente desee una matriz real o al menos una
ArrayList
para contener las filas, ya queLinkedList
debe atravesar toda la lista desde el primer elemento hasta cualquier elemento en particular, unaO(n)
operación, a diferencia de mucho más rápidoO(1)
conArrayList
una matriz real.Sin embargo, dado que mencionó que esta matriz es escasa, quizás una mejor manera de almacenar los datos es como un mapa de mapas, donde una clave en el primer mapa representa un índice de fila, y su valor es un mapa de fila cuyas claves son un índice de columna , siendo el valor su clase IntegerNode. Así:
Si necesita poder atravesar la matriz fila por fila, puede hacer que el mapa de filas sea de tipo a
TreeMap
, y lo mismo para atravesar las columnas en orden de índice, pero si no necesita esos casos,HashMap
es más rápido queTreeMap
. Los métodos auxiliares para obtener y establecer una celda arbitraria, manejando valores nulos no establecidos, serían útiles, por supuesto.fuente
fuente
La transmisión de esta manera funciona, pero aún te deja con una advertencia desagradable:
"Seguridad de tipos: la expresión de tipo Lista [] necesita una conversión sin marcar ..."
es una idea inteligente para evitar la advertencia. tal vez sea un poco mejor usar una interfaz para ello:
luego
compila sin advertencias.
no se ve tan mal, ¿verdad?
fuente
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
Esto tiene un problema sutil pero importante. Puede solamente ponerIntegerNodeList
en la matriz.myMatrix[i] = new ArrayList<IntegerNode>();
arrojaráArrayStoreException
.No hay advertencias. NetBeans 6.9.1, jdk1.6.0_24
fuente
No hay una creación de matriz genérica en Java 1.5 (o 1.6 por lo que puedo decir). Consulte https://community.oracle.com/message/4829402 .
fuente
Si hago lo siguiente, aparece el mensaje de error en cuestión.
Pero si elimino el tipo de lista en la declaración, parece tener la funcionalidad deseada.
¿Son estas dos declaraciones drásticamente diferentes de una manera que no conozco?
EDITAR
Ah, creo que me he encontrado con este problema ahora.
Iterar sobre la matriz e inicializar las listas en un bucle for parece funcionar. Aunque no es tan ideal como algunas de las otras soluciones que se ofrecen.
fuente
Necesita una matriz de List, una alternativa es probar:
Luego
node_array[i]
almacena el nodo principal (primer) de unArrayList<IntegerNode>
oLinkedList<IntegerNode>
(cualquiera que sea su implementación de lista favorita).Bajo este diseño, pierde el método de acceso aleatorio
list.get(index)
, pero luego aún puede recorrer la lista comenzando con el almacén de nodos de cabeza / puño en la matriz de tipo seguro.Esta podría ser una opción de diseño aceptable según su caso de uso. Por ejemplo, utilizo este diseño para representar una lista de adyacencia de gráfico, en la mayoría de los casos de uso, requiere atravesar la lista de adyacencia de todos modos para un vértice dado en lugar de acceder aleatoriamente a algún vértice de la lista.
fuente