Matrices de longitud variable (dinámicas) en Java

108

Me preguntaba cómo inicializar una matriz de enteros de modo que su tamaño y sus valores cambien durante la ejecución de mi programa, ¿alguna sugerencia?

Mohammad Sepahvand
fuente

Respuestas:

121

Sí: use ArrayList .

En Java, las matrices "normales" son de tamaño fijo. Tienes que darles un tamaño y no puedes expandirlos ni contraerlos. Para cambiar el tamaño, debe crear una nueva matriz y copiar los datos que desea, lo cual es ineficiente y molesto para usted.

Afortunadamente, existen todo tipo de clases integradas que implementan estructuras de datos comunes y también otras herramientas útiles. Querrá consultar la API de Java 6 para obtener una lista completa de ellos.

Una advertencia: ArrayList solo puede contener objetos (por ejemplo, enteros), no primitivas (por ejemplo, ints). En la MAYORÍA de los casos, el autoboxing / autounboxing se encargará de esto silenciosamente, pero podría tener un comportamiento extraño dependiendo de lo que esté haciendo.

Pops
fuente
2
Me pregunto por qué el siguiente código es correcto en Java. int[] array = new int[size]; sizees una variable, pero la longitud de una matriz debe ser fija, ¿verdad? @Lord Torgamus
jerry_sjtu
12
@jerry_sjtu sí, la matriz no cambia de tamaño para coincidir a sizemedida que avanza el programa; obtiene el tamaño que tenga sizecuando se ejecuta esa línea.
Pops
Siempre que elimino un elemento de una ArrayList, termino con un nullal final. ¿Alguna idea de por qué?
Aaron Franke
37

Las matrices en Java son de tamaño fijo. Lo que necesitaría es una ArrayList, una de las colecciones extremadamente valiosas disponibles en Java.

En vez de

Integer[] ints = new Integer[x]

tu usas

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

Luego, para cambiar la lista que usa ints.add(y)y ints.remove(z)entre muchos otros métodos útiles que puede encontrar en los Javadocs apropiados.

Recomiendo encarecidamente estudiar las clases de Colecciones disponibles en Java, ya que son muy poderosas y le brindan muchas funciones integradas que los principiantes de Java tienden a intentar reescribir innecesariamente.

MattGrommes
fuente
quiero trabajar hasta que lo intente: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm
5
¿Por qué usas en List<Integer>lugar de ArrayList<Integer>?
Dean Meehan
25

Las matrices tienen un tamaño fijo una vez creadas. En su lugar, puede utilizar una lista.

Autoboxing hace que una lista se pueda usar de manera similar a una matriz, puede poner simplemente valores int en ella:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Mnementh
fuente
2
¿Por qué declara una variable de referencia de tipo List y no ArrayList?
LppEdd
2
Debido a que le permite simplemente cambiar entre implementaciones de lista si es necesario, solo tiene que cambiar el nuevo XYZList (). Si la variable se declara como ArrayList, oyu podría usar métodos específicos para esta implementación, haciendo un cambio más complicado.
Mnementh
1
Gracias, lo entiendo.
LppEdd
11

No estoy de acuerdo con las respuestas anteriores que sugieren ArrayList, porque noArrayList es una matriz dinámica sino una lista respaldada por una matriz. La diferencia es que no puede hacer lo siguiente:

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

Le dará una IndexOutOfBoundsException porque todavía no hay ningún elemento en esta posición a pesar de que la matriz de respaldo permitiría tal adición. Por lo tanto, debe usar una implementación de matriz extensible personalizada como lo sugiere @ randy-lance

cspann
fuente
Creo que querías vincularlo a codereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta
No estoy seguro de si ArrayList tiene algún método de colocación como veo en el código fuente de Java8. Solo estoy tratando de averiguar cómo se comporta con la capacidad dada. Sin embargo, se encontró el método ArrayList.add ().
Sanjeet A
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]);
}    
}

}

Fuente: Cómo hacer una matriz dinámica.

Anuj Dhiman
fuente
7
  1. Se recomienda utilizar List para tratar el tamaño de pequeña escala.

  2. Si tiene una gran cantidad de números, NUNCA use List y autoboxing,

    Lista <Entero> lista

Para cada int, se crea automáticamente un nuevo entero. Verá que se vuelve lento cuando aumenta el tamaño de la lista. Estos enteros son objetos innecesarios. En este caso, sería mejor utilizar un tamaño estimado,

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

¿Qué tal usar un Listen su lugar? Por ejemplo,ArrayList<integer>

Konrad Garus
fuente
4

No puede cambiar el tamaño de una matriz. Sin embargo, puede crear una nueva matriz con el tamaño correcto y copiar los datos de la matriz anterior a la nueva.

Pero su mejor opción es usar IntList de jacarta commons. ( aquí )

Funciona igual que una List, pero ocupa menos espacio y es más eficiente que eso, porque almacena int's en lugar de almacenar objetos contenedores sobre int's (eso es lo que es la clase Integer).

Thiago Chaves
fuente
-4

Respondí esta pregunta y no, no necesitas una lista de matrices o cualquier otra cosa, esta fue una tarea y la completé, así que sí, las matrices pueden aumentar de tamaño. Aquí está el enlace Cómo usar Java Dynamic Array y aquí está el enlace para mi pregunta a la que respondí Java Dynamic Array

Nadie
fuente
1
esto está mal. la respuesta vinculada llama a System.arrayCopy (), copia la matriz anterior en una nueva con mayor tamaño y luego agrega la nueva entrada. las matrices aún no pueden tener un tamaño dinámico.
katzenhut