Eu tenho uma classe - xClass, que desejo carregar em uma matriz de xClass, então faço a declaração:
xClass mysclass[] = new xClass[10];
myclass[0] = new xClass();
myclass[9] = new xClass();
No entanto, não sei se vou precisar de 10. Posso precisar de 8 ou 12 ou qualquer outro número para esse assunto. Eu não saberei até o tempo de execução. Posso alterar o número de elementos em uma matriz rapidamente? Se sim, como?
Respostas:
Não, você não pode alterar o tamanho de uma matriz uma vez criada. Você deve alocá-lo maior do que pensa que precisará ou aceitar a sobrecarga de ter que realocá-lo para crescer em tamanho. Quando isso acontecer, você terá que alocar um novo e copiar os dados do antigo para o novo:
Se você se encontrar nesta situação, eu recomendo usar as coleções Java. Em particular,
ArrayList
essencialmente envolve uma matriz e cuida da lógica para aumentar a matriz conforme necessário:Geralmente um
ArrayList
é uma solução preferível para um array por vários motivos. Por um lado, os arrays são mutáveis. Se você tem uma classe que faz isso:você criou um problema, pois um chamador pode alterar seu membro de dados privado, o que leva a todos os tipos de cópia defensiva. Compare isso com a versão da lista:
fonte
Em java, o comprimento do array é fixo.
Você pode usar uma lista para conter os valores e invocar o
toArray
método, se necessário. Consulte o exemplo a seguir:fonte
Como já foi dito, você não pode alterar o tamanho de um array Java existente.
ArrayList é o mais próximo que o Java padrão tem de uma matriz de tamanho dinâmico. No entanto, existem algumas coisas sobre ArrayList (na verdade, a interface List) que não são "semelhantes a array". Por exemplo:
[ ... ]
para indexar uma lista. Você deve usar os métodosget(int)
eset(int, E)
.set(15, foo)
.add
,insert
eremove
métodos.Se você quiser algo mais parecido com array, precisará projetar sua própria API. (Talvez alguém possa entrar em contato com uma biblioteca existente de terceiros ... Não consegui encontrar uma com 2 minutos de "pesquisa" usando o Google :-))
Se você realmente precisa apenas de um array que cresce conforme você o inicializa , a solução é algo assim.
fonte
Você define o número de elementos como quiser no momento em que os cria:
Então você pode inicializar os elementos em um loop. Suponho que é disso que você precisa.
Se você precisar adicionar ou remover elementos do array depois de criá-lo, terá que usar um
ArrayList
.fonte
Você pode usar ArrayList:
...
fonte
Arrays.copyOf()
método tem muitas opções para corrigir o problema com o comprimento do Array aumentando dinamicamente.API Java
fonte
Sim, envolva-o e use a estrutura de coleções.
Em seguida, use List.toArray () quando necessário ou apenas itere sobre a referida Lista.
fonte
Como outros usuários dizem, você provavelmente precisa de uma implementação de java.util.List.
Se, por algum motivo, você finalmente precisar de uma matriz, poderá fazer duas coisas:
Use uma lista e converta-a em uma matriz com myList.toArray ()
Use uma matriz de determinado tamanho. Se você precisar de mais ou menos tamanho, pode modificá-lo com os métodos java.util.Arrays.
A melhor solução dependerá do seu problema;)
fonte
Eu recomendo usar vetores em vez disso. Muito fácil de usar e possui vários métodos predefinidos de implementação.
para adicionar um elemento, basta usar:
Em (5,2), os primeiros 5 são o tamanho inicial do vetor. Se você exceder o tamanho inicial, o vetor aumentará 2 casas. Se exceder novamente, aumentará novamente em 2 casas e assim por diante.
fonte
Onde você declara a matriz myclass [] como:
, simplesmente passe como argumento o número de elementos XClass de que você precisa. Nesse ponto, você sabe de quantos você precisará? Ao declarar a matriz como tendo 10 elementos, você não está declarando 10 objetos XClass, mas simplesmente criando uma matriz com 10 elementos do tipo xClass.
fonte
Os tamanhos do array Java são fixos, você não pode criar arrays dinâmicos como no C ++.
fonte
É uma boa prática obter a quantidade que você precisa armazenar primeiro e, em seguida, inicializar o array.
por exemplo, você perguntaria ao usuário quantos dados ele precisa armazenar e, em seguida, inicializaria, ou consultaria o componente ou argumento de quantos dados você precisa armazenar. se quiser um array dinâmico, você pode usar
ArrayList()
e usar aal.add();
função para continuar adicionando, então você pode transferi-lo para um array fixo.isso é redundante, mas apenas para mostrar-lhe a idéia,
ArrayList
pode segurar objetos ao contrário de outros tipos de dados primitivos e são muito fáceis de manipular, remover qualquer coisa a partir do meio é tão fácil assim, completamente dynamic.same comList
eStack
fonte
Não sei se você pode alterar o tamanho em tempo de execução, mas você pode alocar o tamanho em tempo de execução. Tente usar este código:
isso atribui o tamanho do seu array aquele inserido em tempo de execução em x.
fonte
Aqui está um método que não usa ArrayList. O usuário especifica o tamanho e você pode adicionar um loop do-while para recursão.
fonte
Em Java Array, os tamanhos são sempre de comprimento fixo, mas há uma maneira de aumentar dinamicamente o tamanho do array no próprio tempo de execução
Esta é a maneira mais "usada" e preferida de fazer isso-
No código acima, estamos inicializando um novo array temp [] e, posteriormente, usando um loop for para inicializar o conteúdo do temp com o conteúdo do array original, ou seja. stck []. E, em seguida, copiá-lo novamente para o original, nos dando uma nova matriz de novo SIZE.
Sem dúvida, ele gera uma sobrecarga de CPU devido à reinicialização de um array usando o loop for repetidamente. Mas você ainda pode usar e implementar em seu código. Para a melhor prática, use "Linked List" em vez de Array, se quiser que os dados sejam armazenados dinamicamente na memória, de comprimento variável.
Aqui está um exemplo em tempo real baseado em pilhas dinâmicas para AUMENTAR O TAMANHO DA ARRAY em tempo de execução
Nome do arquivo: DStack.java
Nome do arquivo: Exec.java
(com a classe principal)
Espero que isso resolva sua dúvida.
fonte
Sim, podemos fazer assim.
fonte
Visto que ArrayList consome muita memória quando preciso de uma matriz de tipos primitivos, prefiro usar IntStream.builder () para criar uma matriz int (você também pode usar os construtores LongStream e DoubleStream).
Exemplo:
Nota: disponível desde Java 8.
fonte
Você pode fazer alguma coisa
fonte