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?

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.


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.


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);

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



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.


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];


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).


-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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.