2012-01-04 15 views
6

¿Por qué se genera java.lang.IndexOutOfBoundsException en este ejemplo, si el tamaño de ArrayList ha sido predefinido? ¿Cómo resolver este problema?ArrayList índice fuera de los límites

int size = 2: 
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size); 
Integer[] value1 = {1,2,3}; 
Integer[] value2 = {1,2}; 
nums.add(1,value1); // java.lang.IndexOutOfBoundsException 
nums.add(0,value2); 

Respuesta

11

No se puede poner un elemento en una ArrayList antes de que se establezca el otro. Si quieres hacerlo, primero debes asignar valores nulos al elemento en el lugar 0.

Se trabajará si usted:

int size = 2: 
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size); 
Integer[] value1 = {1,2,3}; 
Integer[] value2 = {1,2}; 
nums.add(0, null); 
nums.add(1,value1); 
nums.set(0,value2); 

editar/añadir Sustituido por set para reemplazar el objeto nulo

+3

Para ser más claro, es realmente que no se puede insertar un elemento en un índice que todavía no existe. –

+3

Para no adivinar la sabiduría aquí, ¿la 3ª adición() de la solución anterior * cambia * los contenidos, de modo que value1 ahora está en el índice 2, no en el 1? El documento sobre add() con un índice lo indica. Creo que los contenidos de la matriz después de esto serían {value2, null, value1}. – rfeak

2

En el momento que add() a la ArrayList, la longitud de la lista es 0 . No puede agregar más allá del final actual del List.

Yo sugeriría hacer:

nums.add(value2); 
nums.add(value1); 

Para obtener el orden que parecen querer aquí.

+0

No funcionará para mi caso, porque podría necesitar agregar cierto elemento en la posición 5, el siguiente en la posición 2, el siguiente en la posición 7, etc. –

+1

@KlausosKlausos - Parece que en realidad no quieres una ArrayList, al menos no inicialmente. Puede ser mejor comenzar con una matriz simple de cierto tamaño, hacer todas las inserciones por índice para no tener que jugar juegos divertidos con ArrayList, ENTONCES poner la matriz en una ArrayList. Además, tenga en cuenta que add() en un índice causa un cambio en el contenido existente de la matriz. Al agregar en la posición 5, la posición 2 cambia lo que insertó en 5 y ahora estará en 6. – rfeak

8

El argumento para el constructor ArrayList no tiene el tamaño de la lista, como su código lo asume; es la capacidad del almacenamiento subyacente utilizado por la estructura de datos.

La capacidad crecerá según sea necesario a medida que agrega elementos a la lista. La única razón para especificar la capacidad inicial en el constructor es preasignar una capacidad mayor si sabe que va a agregar muchos elementos. Esto significa que la matriz subyacente no necesita ser redimensionada con demasiada frecuencia cuando la agregue.

Independientemente de qué valor se especifica en el ArrayList constructor, el tamaño de la lista se rige únicamente por lo que puso en él, por lo que no puede recuperar el elemento con index de 1 hasta que haya agregado al al menos 2 elementos.

0

Para obtener el resultado que desea tener, usted tiene que escribir

nums.add(0, value1); 
nums.add(0, value2); 
2

http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html#ArrayList(int)

Lo que se especifique que es la capacidad inicial, eso es sólo el tamaño inicial de que la matriz interna tiene y que se aumenta automáticamente si es necesario. No tiene nada que ver con la posición del artículo, de ahí el error. Por cierto, la capacidad predeterminada para ArrayLists es 10, por lo que en realidad lo está haciendo más pequeño que el predeterminado.

1

De acuerdo con la javadoc, Cuando se escribe

ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size); 

usted no está definiendo el tamaño de nums, se está definiendo la capacidad inicial - en este sentido, ArrayLists aren' t les gusta las matrices incorporadas (value1 y value2 en su código).

Puede hacerlo por uno mismo: imprimir el tamaño de nums después de cada línea (código limpiado para evitar que el IndexOutOfBoundsException

int size = 2: 
ArrayList<Integer[]> nums = new ArrayList<Integer[]>(size); 
Integer[] value1 = {1,2,3}; 
Integer[] value2 = {1,2}; 
System.out.println(nums.size()); 
nums.add(value2); 
System.out.println(nums.size()); 
nums.add(value1); 
System.out.println(nums.size()); 

Esto imprimirá:.

0 
1 
2 
0

Con el fin de Obtenga los resultados que espera Recomendaría utilizar matrices de tipo base como

Integer[][] nums = new Integer[size][]; 

y luego

Integer[] value1 = {1,2,3}; 
Integer[] value2 = {1,2}; 
nums[1] = value1; 
nums[0] = value2; 

Si aún necesita un ArrayList sólo tiene que utilizar

new ArrayList<Integer[]>(Arrays.asList(nums)); 
Cuestiones relacionadas