Estou trabalhando em uma classe de matriz esparsa que precisa usar uma matriz de LinkedList
para armazenar os valores de uma matriz. Cada elemento da matriz (ou seja, cada um LinkedList
) representa uma linha da matriz. E, cada elemento da LinkedList
matriz representa uma coluna e o valor armazenado.
Em minha aula, tenho uma declaração da matriz como:
private LinkedList<IntegerNode>[] myMatrix;
E, em meu construtor para o SparseMatrix
, tento definir:
myMatrix = new LinkedList<IntegerNode>[numRows];
O erro que acabo recebendo é
Não é possível criar uma matriz genérica de
LinkedList<IntegerNode>
.
Então, tenho dois problemas com isso:
- O que estou fazendo de errado e
- Por que o tipo é aceitável na declaração do array se ele não pode ser criado?
IntegerNode
é uma classe que criei. E, todos os meus arquivos de classe são empacotados juntos.
class IntegerNodeList extends List<IntegerNode> {}
Por algum motivo, você deve lançar o tipo e fazer a declaração assim:
fonte
Além dos problemas de sintaxe, parece-me estranho usar um array e uma lista vinculada para representar uma matriz. Para ser capaz de acessar células arbitrárias da matriz, você provavelmente desejaria um array real ou pelo menos um
ArrayList
para conter as linhas, já queLinkedList
deve percorrer toda a lista do primeiro elemento a qualquer elemento em particular, umaO(n)
operação, ao invés de muito mais rápidoO(1)
comArrayList
ou uma matriz real.Como você mencionou que esta matriz é esparsa, talvez a melhor maneira de armazenar os dados seja como um mapa de mapas, onde uma chave no primeiro mapa representa um índice de linha e seu valor é um mapa de linha cujas chaves são um índice de coluna , com o valor sendo sua classe IntegerNode. Portanto:
Se você precisa ser capaz de percorrer a matriz linha por linha, você pode fazer o mapa de linha tipo a
TreeMap
, e mesmo para percorrer as colunas na ordem do índice, mas se você não precisar desses casos,HashMap
é mais rápido queTreeMap
. Métodos auxiliares para obter e definir uma célula arbitrária, manipulando valores nulos não definidos, seriam úteis, é claro.fonte
fonte
lançar desta forma funciona, mas ainda deixa você com um aviso desagradável:
"Segurança de tipo: A expressão do tipo Lista [] precisa de conversão desmarcada .."
é uma ideia inteligente para evitar o aviso. talvez um pouco mais agradável seja usar uma interface para isso:
então
compila sem avisos.
não parece tão ruim, não é?
fonte
List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];
Isso tem um problema sutil, mas importante. Você só pode colocarIntegerNodeList
na matriz.myMatrix[i] = new ArrayList<IntegerNode>();
vai jogarArrayStoreException
.Sem quaisquer avisos. NetBeans 6.9.1, jdk1.6.0_24
fonte
Não há criação de array genérico em Java 1.5 (ou 1.6 até onde posso dizer). Consulte https://community.oracle.com/message/4829402 .
fonte
Se eu fizer o seguinte, recebo a mensagem de erro em questão
Mas se eu apenas remover o tipo de lista na declaração, parece ter a funcionalidade desejada.
Essas duas declarações são drasticamente diferentes de uma forma que não estou ciente?
EDITAR
Ah, acho que já me deparei com esse problema.
Iterar sobre a matriz e inicializar as listas em um loop for parece funcionar. Embora não seja tão ideal quanto algumas das outras soluções oferecidas.
fonte
Você precisa de uma matriz de List, uma alternativa é tentar:
Em seguida,
node_array[i]
armazena o nó principal (primeiro) de umArrayList<IntegerNode>
ouLinkedList<IntegerNode>
(qualquer que seja sua implementação de lista favorita).Sob este design, você perde o método de acesso aleatório
list.get(index)
, mas então você ainda pode percorrer a lista começando com o armazenamento de nó head / fist no array de tipo seguro.Esta pode ser uma escolha de design aceitável, dependendo do seu caso de uso. Por exemplo, eu uso este projeto para representar uma lista de adjacências de grafo, na maioria dos casos de uso, requer atravessar a lista de adjacências de qualquer maneira para um determinado vértice em vez de acessar aleatoriamente algum vértice na lista.
fonte