2010-03-11 12 views

Respuesta

107

Sí: use ArrayList.

En Java, las matrices "normales" son de tamaño fijo. Tienes que darles un tamaño y no puedes expandirlos o contraerlos. Para cambiar el tamaño, debe crear una nueva matriz y copiar los datos que desee, lo que es ineficiente y le resulta doloroso.

Afortunadamente, hay todo tipo de clases integradas que implementan estructuras de datos comunes, y otras herramientas útiles también. Deberá verificar the Java 6 API para obtener una lista completa de ellos.

Una advertencia: ArrayList solo puede contener objetos (por ejemplo, enteros), no primitivos (por ejemplo, enteros). En la mayoría de los casos, autoboxing/autounboxing se encargará de esto por usted en silencio, pero podría tener un comportamiento extraño dependiendo de lo que esté haciendo.

+2

Me pregunto por qué siguiente código es correcto en Java? 'int [] array = new int [size];' 'size' es una variable, pero la longitud de una matriz debe ser fija, ¿estoy en lo cierto? @Lord Torgamus –

+9

@jerry_sjtu Sí, la matriz no cambia de tamaño a emparejar 'size' mientras el programa continúa; obtiene cualquier tamaño que esté en 'tamaño' cuando se ejecuta esa línea. – Pops

+0

Cada vez que elimino un elemento de una ArrayList, termino con un 'null' al final. ¿Alguna idea de por qué? –

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 utilizar IntList de jacarta commons. (here)

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

4

¿Qué tal si usas un List? Por ejemplo, ArrayList<integer>

17

Las matrices son de tamaño fijo una vez instanciadas. Puedes usar una lista en su lugar.

Autoboxing hacer una lista utilizable similar a una matriz, se puede poner simplemente los valores int en él:

List<Integer> list = new ArrayList<Integer>(); 
list.add(1); 
list.add(2); 
list.add(3); 
+1

¿Por qué declaras una variable de referencia de tipo Lista, y no ArrayList? – LppEdd

+1

Dado que le permite simplemente cambiar entre implementaciones de listas si es necesario, solo tiene que cambiar la nueva XYZList(). Si la variable se declara como ArrayList, oyu puede usar métodos específicos para esta implementación, lo que hace un cambio más complicado. – Mnementh

+1

Gracias, lo entiendo. – LppEdd

29

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

En lugar de

Integer[] ints = new Integer[x] 

que utilizan

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

A continuación, cambiar la lista utiliza ints.add(y) y ints.remove(z) entre muchos otros métodos útiles se pueden encontrar en el Javadocs apropiado.

Recomiendo estudiar las clases de colecciones disponibles en Java, ya que son muy potentes y le dan mucha funcionalidad incorporada que los novatos de Java tienden a intentar reescribir innecesariamente.

+0

quiero trabajar hasta que intenté: List ints = new ArrayList (); – gorbysbm

+2

¿Por qué usas 'List ' en lugar de 'ArrayList '? –

-3

Respondí esta pregunta y no necesitas una lista de arrays ni ninguna otra cosa, esta era una tarea y la completé para que las matrices puedan aumentar de tamaño.Aquí está el enlace How to use Java Dynamic Array y aquí está el enlace de mi pregunta lo que respondí Java Dynamic arrays

+1

esto es simplemente incorrecto. 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

8

estoy de acuerdo con las respuestas anteriores sugiriendo ArrayList, porque ArrayList es no una matriz dinámica pero hay una lista apoyada por una matriz. La diferencia es que no se puede hacer lo siguiente:

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

que le dará un IndexOutOfBoundsException porque no hay ningún elemento en este puesto aún a pesar de que la matriz de soporte permitiría tal adición. Así que hay que utilizar una implementación de matriz personalizada extensible como el sugerido por @ Randy-lance

+0

Creo que quería vincularlo a http://codereply.com/answer/6i5bur/java-dynamic-arrays.html –

+0

No estoy seguro si ArrayList tiene algún método put como veo en el código fuente Java8. Solo trato de descubrir cómo se comporta con la capacidad dada. Sin embargo, se encontró el método ArrayList.add(). –

8
  1. Es recomendable utilizar la lista para hacer frente a tamaño de pequeña escala.

  2. Si usted tiene una gran cantidad de números, NUNCA Lista uso y autoboxing,

    Lista < Integer> lista

Para cada int, un nuevo entero se ha creado automáticamente. Le resultará cada vez más lento cuando aumente el tamaño de la lista. Estos enteros son objetos innecesarios. En este caso, utilizar un tamaño estimado sería mejor,

int[] array = new int[ESTIMATED_SIZE]; 
7
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: How to make dynamic array