2012-04-21 21 views
13

Tengo una pregunta rápida. Tengo una matriz de enteros en Java que necesita su longitud para variar en toda la clase. Específicamente, necesito que aumente en uno en ciertas situaciones. Lo intenté así.Cómo aumentar la longitud de una matriz

 sbgHeadX = new int[ numberOfSBG ]; 

que aumentaría la variable entera numberOfSBG cuando necesitaba, pero no creo que esto funciona. ¿Hay alguna otra manera?

+0

Puede proporcionar un máximo razonable. Obviamente, su matriz nunca puede ser más grande que Integer.MAX_VALUE, pero si usted sabe que su matriz tampoco puede ser mayor que 300, puede establecer su longitud en 300. – emory

+0

@emory - personalmente, consideraría hacerlo para ser un fuerte olor a código: el resultado es una matriz, algunos de cuyos elementos "no deben usarse". Es un estilo de codificación torpe y propenso a errores, que requiere pasar una variable separada con la cantidad de elementos válidos. También rompe la suposición de que '.size()' produce la cantidad de elementos con los que trabajar. – ToolmakerSteve

Respuesta

13

yo sugeriría que utilizar un ArrayList ya que no tendrá que preocuparse por la longitud más. Una vez creado, no puede modificar un tamaño de matriz:

Una matriz es un objeto contenedor que contiene un número fijo de valores de un solo tipo. La longitud de una matriz se establece cuando se crea la matriz. Después de la creación, su longitud es fija.

(Source)

+0

¿cómo accedería a un índice específico de la lista de arrays? – kullalok

+1

@ user1276078 'yourArailist.get (2)' es el equivalente de 'yourClassicArray [2]' – talnicolas

+1

Mientras esto funciona, esto puede causar un autoboxing innecesario, ya que el OP indicó que era una primitiva int. Las colecciones Java requieren Objetos como su valor, por lo que la JVM convertirá todos los valores a Entero cada vez que se llame al método de recolección. Esto podría resultar costoso a lo largo del tiempo. Obviamente, el programador necesita decidir si vale la pena hacer algo como lo sugiere Hunter McMillen a continuación, pero su respuesta es, en mi humilde opinión, una respuesta más precisa a la pregunta. –

1

Por definición, las matrices tienen un tamaño fijo. Puede usar en su lugar un Arraylist que es eso, una matriz de "tamaño dinámico". En realidad, lo que sucede es que la VM "ajusta el tamaño" * de la matriz expuesta por ArrayList.

See also

* usando matrices de back-copia

+3

* "En realidad, lo que sucede es que la máquina virtual ajusta el tamaño de la matriz expuesta por la lista de arrays". Incorrecto. De hecho, el código para 'ArrayList' crea una nueva matriz de respaldo y copia el contenido de la existente. La longitud de la matriz no se puede cambiar ... ni siquiera con la JVM. Sería una violación de la Especificación del lenguaje Java. –

+1

@StephenC Tienes razón. Mi culpa al explicar. –

+0

Aún tiene la mitad de razón. No es la JVM la que realiza el ajuste. La clase 'ArrayList' lo hace ... en el código Java normal. Y la matriz NO está expuesta por la lista de arreglos ... es un objeto privado que está ESCONDIDO por la lista de arreglos. –

18

Si no quiere o no puede utilizar ArrayList, entonces no es un método de utilidad:

Arrays.copyOf() 

que le permitirá especificar el nuevo tamaño, preservando al mismo tiempo la elementos.

+2

"Este algoritmo ofrece el rendimiento n * log (n) en muchos conjuntos de datos que hacen que otras unidades rápidas se degraden a rendimiento cuadrático". –

21

Las matrices en Java son de tamaño fijo que se especifica cuando se declaran. Para aumentar el tamaño de la matriz, debe crear una nueva matriz con un tamaño mayor y copiar todos los valores anteriores en la nueva matriz.

ejemplo:

char[] copyFrom = { 'a', 'b', 'c', 'd', 'e' }; 
char[] copyTo = new char[7]; 

System.out.println(Arrays.toString(copyFrom)); 
System.arraycopy(copyFrom, 0, copyTo, 0, copyFrom.length); 
System.out.println(Arrays.toString(copyTo)); 

otra posibilidad es utilizar una estructura de datos dinámica como una lista.

+2

En mi humilde opinión, usando 'Arrays.copyOf()', como en la respuesta de Jakub, daría un código más corto y más legible. – ToolmakerSteve

0
Item[] newItemList = new Item[itemList.length+1]; 
    //for loop to go thorough the list one by one 
    for(int i=0; i< itemList.length;i++){ 
     //value is stored here in the new list from the old one 
     newItemList[i]=itemList[i]; 
    } 
    //all the values of the itemLists are stored in a bigger array named newItemList 
    itemList=newItemList; 
0

Puede hacer uso de ArrayList. Array tiene el número de tamaño fijo.

Este Example aquí puede ayudarlo. El ejemplo es bastante fácil con su salida.

 
Output: 
2 5 1 23 14 
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29
Cuestiones relacionadas