Arrays de comprimento variável (dinâmico) em Java

108

Eu queria saber como inicializar uma matriz de inteiros de modo que seu tamanho e valores mudem durante a execução do meu programa, alguma sugestão?

Mohammad Sepahvand
fonte

Respostas:

121

Sim: use ArrayList .

Em Java, os arrays "normais" têm tamanho fixo. Você tem que dar um tamanho a eles e não pode expandi-los ou contraí-los. Para alterar o tamanho, você precisa fazer uma nova matriz e copiar os dados desejados - o que é ineficiente e uma dor de cabeça.

Felizmente, existem todos os tipos de classes integradas que implementam estruturas de dados comuns e também outras ferramentas úteis. Você vai querer verificar a API Java 6 para obter uma lista completa deles.

Uma advertência: ArrayList só pode conter objetos (por exemplo, inteiros), não primitivos (por exemplo, ints). Na MAIORIA dos casos, autoboxing / autounboxing cuidará disso para você silenciosamente, mas você pode ter um comportamento estranho dependendo do que estiver fazendo.

Pops
fonte
2
Eu me pergunto por que seguir o código está certo em java? int[] array = new int[size]; sizeé uma variável, mas o comprimento de um array deve ser fixo, certo? @Lord Torgamus
jerry_sjtu
12
@jerry_sjtu sim, a matriz não muda de tamanho para corresponder à sizemedida que o programa prossegue; ele obtém qualquer tamanho que esteja sizequando a linha for executada.
Aparece em
Sempre que removo um item de uma ArrayList, acabo com um nullno final. Alguma ideia por quê?
Aaron Franke de
37

Arrays em Java são de tamanho fixo. O que você precisa é de um ArrayList, uma das várias coleções extremamente valiosas disponíveis em Java.

Ao invés de

Integer[] ints = new Integer[x]

você usa

List<Integer> ints = new ArrayList<Integer>();

Em seguida, para alterar a lista que você usa ints.add(y)e ints.remove(z)entre muitos outros métodos úteis, você pode encontrar nos Javadocs apropriados.

Eu recomendo fortemente estudar as classes de coleções disponíveis em Java, pois elas são muito poderosas e fornecem muitas funcionalidades embutidas que os novatos em Java tendem a tentar reescrever desnecessariamente.

MattGrommes
fonte
quero trabalhar até tentar: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm
5
Por que você usa em List<Integer>vez de ArrayList<Integer>?
Dean Meehan
24

Os arrays têm tamanho fixo depois de instanciados. Você pode usar uma lista em vez disso.

O Autoboxing torna uma List utilizável de forma semelhante a uma matriz, você pode simplesmente colocar valores int nela:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Mnementh
fonte
2
Por que você declara uma variável de referência do tipo List, e não ArrayList?
LppEdd
2
Porque ele permite que você simplesmente alterne entre as implementações de List, se necessário, você só precisa alterar o novo XYZList (). Se a variável for declarada como ArrayList, oyu pode usar métodos específicos para essa implementação, tornando a alteração mais complicada.
Mnementh
1
Obrigado, eu entendo.
LppEdd
11

Não concordo com a sugestão de respostas anteriores ArrayList, porque nãoArrayList é um Dynamic Array, mas uma List apoiada por um array. A diferença é que você não pode fazer o seguinte:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Isso lhe dará uma IndexOutOfBoundsException porque não há nenhum elemento nesta posição ainda, embora a matriz de apoio permitiria tal adição. Portanto, você precisa usar uma implementação de Array extensível personalizada, como sugerido por @ randy-lance

cspann
fonte
Acredito que você queira vinculá-lo a codereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta
Não tenho certeza se ArrayList tem algum método put como vejo no código-fonte Java8. Apenas tentando descobrir como ele se comporta com determinada capacidade. No entanto, encontrado o método ArrayList.add ().
Sanjeet A de
11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

Fonte: Como fazer array dinâmico

Anuj Dhiman
fonte
7
  1. Recomenda-se usar List para lidar com tamanhos de pequena escala.

  2. Se você tiver um grande número de números, NUNCA use List e autoboxing,

    Lista lista <Inteiro>

Para cada int, um novo Integer é criado automaticamente. Você perceberá que fica lento quando o tamanho da lista aumenta. Esses inteiros são objetos desnecessários. Nesse caso, usar um tamanho estimado seria melhor,

int[] array = new int[ESTIMATED_SIZE];
Hao Deng
fonte
4

Que tal usar um List? Por exemplo,ArrayList<integer>

Konrad Garus
fonte
4

Você não pode alterar o tamanho de uma matriz. Você pode, no entanto, criar um novo array com o tamanho certo e copiar os dados do array antigo para o novo.

Mas sua melhor opção é usar o IntList do jacarta commons. ( aqui )

Funciona como uma List, mas ocupa menos espaço e é mais eficiente do que isso, porque armazena int's em vez de armazenar objetos de invólucro em vez de int's (é isso que a classe Integer é).

Thiago Chaves
fonte
-4

Eu respondi a esta pergunta e não, você não precisa de um arraylist ou qualquer outra coisa, isso foi uma atribuição e eu concluí, então sim os arrays podem aumentar de tamanho. Aqui está o link Como usar Java Dynamic Array e aqui está o link para minha pergunta que respondi Java Dynamic Arrays

Ninguém
fonte
1
isso é simplesmente errado. a resposta vinculada chama System.arrayCopy (), copiando o array antigo em um novo com tamanho aumentado e, em seguida, adicionando a nova entrada. arrays ainda não podem ter um tamanho dinâmico.
katzenhut de