Não misture matrizes e coleções. De fato, não use matrizes, a menos que esteja lidando com primitivos (ou saiba o que está fazendo). Matrizes são um pesadelo de usabilidade, elas tornam seu código insustentável.
Sean Patrick Floyd
13
@SeanPatrickFloyd Você pode explicar por que as matrizes são um pesadelo na usabilidade?
usuário
3
@crucifiedsoul com certeza. um array não pode crescer, você não pode inserir qualquer coisa em uma matriz, uma matriz não substituir métodos padrão como iguais hashcode ou toString etc.
Sean Patrick Floyd
9
@SeanPatrickFloyd ok - bem, preciso exatamente de quatro listas de matriz - planejo acessar cada uma por índice - não preciso que a matriz externa cresça ou encolha - não preciso de toString ou hashcode etc. - - para mim, uma matriz é a escolha óbvia aqui - o que você recomendaria como alternativa nessa situação?
BrainSlugs83
4
Ok, esta é uma pergunta antiga, mas vou fazer assim mesmo e ver se alguém responde. Estou vendo todo mundo falando sobre por que uma matriz de listas é uma péssima idéia, uma prática ruim de codificação etc. Eu procurei isso porque estou aprendendo a fazer cadeias de hash, e a definição de uma cadeia de hash é uma matriz de listas! Então, como exatamente uma estrutura central de dados de programação pode ser uma prática terrível de codificação? Ou isso apenas se enquadra na categoria IYKWYD mencionada pela @Sean?
List<List<Individual>> group = new ArrayList<List<Individual>>();provavelmente seria melhor.
Tom Hawtin - tackline
4
O que significa "não é possível criar uma matriz do tipo genérico"? Isso realmente não faz sentido para mim, porque não é genérico se você fornecer o que é suposto conter, certo?
Andy Andy
5
Estou surpreso com os votos positivos, pois ele não responde à pergunta (ou seja, eu quero fazer isso, como posso fazê-lo). Exceto, talvez, a primeira frase.
Florian F
15
Por que a referência de lista é melhor que ArrayList?
shifu 8/07/2015
3
@shifu uma referência de lista é mais geral que ArrayList; declarar como Lista abstrai a API de ArrayList que se estende além da API de lista. Isso é bom porque simplifica a referência à Lista cuja API provavelmente possui a totalidade do que a Lista é necessária, sem sobrecarregar a API dessa referência com os extras que o ArrayList possui. Você só deve declarar como ArrayList se precisar que algo específico de sua API esteja disponível via referência.
Cellepo # 22/16
98
Como os outros mencionaram, provavelmente é melhor usar outra lista para armazenar o ArrayList, mas se você precisar usar um array:
ArrayList<Individual>[] group =(ArrayList<Individual>[])newArrayList[4];
Ninguém parece explicar bem o porquê e eu gosto do seu snippet acima. por que você recomenda o uso da lista sobre isso?
clankill3r
3
Se o grupo de matrizes não for alterado, essa abordagem será melhor, porque as matrizes são mais rápidas que as classes List <>.
Borzh
33
Obrigado por realmente responder à pergunta. Não há razão lógica para presumir automaticamente que uma lista é preferível a uma matriz sem contexto adicional.
Special Sauce
3
Alguma razão pela qual isso seria preferível a @kelvincer Answer ( ArrayList<String>[] group = new ArrayList[4])? Que boa ação extra o elenco faz?
22616 cellepo
2
Você deve new ArrayList<?>[N]evitar o uso de um tipo bruto.
Este satisfyingly tem o benefício desejado que a adição de um ArrayList de qualquer objeto além String (ou seja: ArrayList<String>em vez de ArrayList<NotString>) a groupnão compilar
cellepo
12
Isso produz um aviso:Note: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Eu não entendo totalmente, por que todo mundo está sugerindo o tipo genérico sobre a matriz, particularmente para esta pergunta.
E se minha necessidade for indexar ndiferentes listas de matrizes.
Com a declaração List<List<Integer>>, preciso criar nArrayList<Integer>objetos manualmente ou colocar um loop for para criar nlistas ou de alguma outra maneira, de qualquer forma, sempre será meu dever criar nlistas.
Não é ótimo se a declararmos através do casting como List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]. Eu vejo isso como um bom design, onde não é necessário criar todo o objeto de indexação (listas de matriz) sozinho
Alguém pode me esclarecer por que esse (arrayform) será um design ruim e quais são suas desvantagens?
AFAICT parece ser um tipo de mentalidade de culto à carga induzida pelo terrível sistema de digitação que Java traz para a mesa.
BrainSlugs83
@smsIce: Não é um design ruim. O problema é que muitos escritores não lêem a questão completa ou a entendem claramente.
Testo
16
Você pode criar Array of ArrayList
List<Integer>[] outer =newList[number];for(int i =0; i < number; i++){
outer[i]=newArrayList<>();}
Isso será útil em cenários como este. Você sabe o tamanho do exterior. Mas o tamanho dos interiores varia. Aqui você pode criar uma matriz de comprimento fixo que contém listas de Matrizes que variam de tamanho. Espero que isso seja útil para você.
No Java 8 e acima, você pode fazer isso de uma maneira muito melhor.
List<Integer>[] outer =newList[number];Arrays.setAll(outer, element ->newArrayList<>());
Quando você usa o ArrayList::new, ele chamará o ArrayList(int)contructor com o índice atual como argumento - ArrayList (1), ArrayList (2), ArrayList (3) etc.). dependendo do seu uso. Eu desencorajaria usá-lo e, em vez disso, preferiria a segunda abordagem na qual você mesmo chama o construtor em sua expressão lambda.
Genhis 15/07/19
8
Isso funciona, matriz de ArrayList. Tente entender como funciona.
import java.util.*;publicclassArrayOfArrayList{publicstaticvoid main(String[] args){// Put the length of the array you needArrayList<String>[] group =newArrayList[15];for(int x =0; x < group.length; x++){
group[x]=newArrayList<>();}//Add some thing to first array
group[0].add("Some");
group[0].add("Code");//Add some thing to Secondarray
group[1].add("In here");//Try to output 'emSystem.out.println(group[0]);System.out.println(group[1]);}}
O problema com esta situação é que, usando uma lista de matrizes, você obtém uma complexidade temporal de o (n) para adicionar em uma posição específica. Se você usa uma matriz, cria um local de memória declarando sua matriz, portanto é constante
Para declarar estaticamente uma matriz de ArrayLists para, digamos, posições de sprite como Pontos:
ArrayList<Point>[] positionList =newArrayList[2];publicMain(---){
positionList[0]=newArrayList<Point>();// Important, or you will get a NullPointerException at runtime
positionList[1]=newArrayList<Point>();}
dinamicamente:
ArrayList<Point>[] positionList;int numberOfLists;publicMain(---){
numberOfLists =2;
positionList =newArrayList[numberOfLists];for(int i =0; i < numberOfLists; i++){
positionList[i]=newArrayList<Point>();}}
Apesar dos cuidados e de algumas sugestões complexas aqui, achei uma matriz de ArrayLists uma solução elegante para representar ArrayLists relacionadas do mesmo tipo.
Respostas:
Conforme a documentação da Oracle :
Em vez disso, você pode fazer:
Como sugerido por Tom Hawting - tackline, é ainda melhor fazer:
fonte
List<List<Individual>> group = new ArrayList<List<Individual>>();
provavelmente seria melhor.Como os outros mencionaram, provavelmente é melhor usar outra lista para armazenar o ArrayList, mas se você precisar usar um array:
fonte
ArrayList<String>[] group = new ArrayList[4]
)? Que boa ação extra o elenco faz?new ArrayList<?>[N]
evitar o uso de um tipo bruto.Isso funciona:
fonte
ArrayList<String>
em vez deArrayList<NotString>
) agroup
não compilarNote: hello.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details.
Você pode criar uma classe estendendo ArrayList
e depois crie a matriz
fonte
Eu não entendo totalmente, por que todo mundo está sugerindo o tipo genérico sobre a matriz, particularmente para esta pergunta.
E se minha necessidade for indexar
n
diferentes listas de matrizes.Com a declaração
List<List<Integer>>
, preciso criarn
ArrayList<Integer>
objetos manualmente ou colocar um loop for para criarn
listas ou de alguma outra maneira, de qualquer forma, sempre será meu dever criarn
listas.Não é ótimo se a declararmos através do casting como
List<Integer>[] = (List<Integer>[]) new List<?>[somenumber]
. Eu vejo isso como um bom design, onde não é necessário criar todo o objeto de indexação (listas de matriz) sozinhoAlguém pode me esclarecer por que esse (arrayform) será um design ruim e quais são suas desvantagens?
fonte
Você pode criar Array of ArrayList
Isso será útil em cenários como este. Você sabe o tamanho do exterior. Mas o tamanho dos interiores varia. Aqui você pode criar uma matriz de comprimento fixo que contém listas de Matrizes que variam de tamanho. Espero que isso seja útil para você.
No Java 8 e acima, você pode fazer isso de uma maneira muito melhor.
Ainda melhor usando a referência de método
fonte
ArrayList::new
, ele chamará oArrayList(int)
contructor com o índice atual como argumento - ArrayList (1), ArrayList (2), ArrayList (3) etc.). dependendo do seu uso. Eu desencorajaria usá-lo e, em vez disso, preferiria a segunda abordagem na qual você mesmo chama o construtor em sua expressão lambda.Isso funciona, matriz de ArrayList. Tente entender como funciona.
Créditos ao Kelvincer por alguns códigos.
fonte
O problema com esta situação é que, usando uma lista de matrizes, você obtém uma complexidade temporal de o (n) para adicionar em uma posição específica. Se você usa uma matriz, cria um local de memória declarando sua matriz, portanto é constante
fonte
Você não pode criar uma matriz do tipo genérico. Crie uma lista de ArrayLists:
ou se você REALMENTE precisar de matriz (AVISO: design incorreto!):
fonte
Criação e inicialização
Acesso de gravação
para acessar elementos de ArrayList interno:
Acesso de leitura
para ler o elemento da matriz i como um ArrayList, use a conversão de tipo:
para o elemento da matriz i: ler o elemento ArrayList no índice j
fonte
List [] listArr = new ArrayList [4];
A linha acima dá aviso, mas funciona (ou seja, cria Array of ArrayList)
fonte
Para declarar estaticamente uma matriz de ArrayLists para, digamos, posições de sprite como Pontos:
dinamicamente:
Apesar dos cuidados e de algumas sugestões complexas aqui, achei uma matriz de ArrayLists uma solução elegante para representar ArrayLists relacionadas do mesmo tipo.
fonte
fonte
Você pode criar assim
ArrayList<Individual>[] group = (ArrayList<Individual>[])new ArrayList[4];
Você precisa criar uma matriz de tipo não genérico e depois convertê-la em uma genérica.
fonte
ArrayList<Integer>[] graph = new ArrayList[numCourses]
Funciona.fonte
Acho isso mais fácil de usar ...
fonte
Você consegue fazer isso :
// Crie uma matriz do tipo ArrayList
// Para cada elemento da matriz, crie um ArrayList
fonte
fonte
você pode criar uma lista [] e inicializá-los pelo loop for. compila sem erros:
ele funciona com arrayList [] l também.
fonte
l.length
é indefinido no loop for. Isso pode ser um erro de tempo de execução.