java.lang.IndexOutOfBoundsException: la fuente no cabe en dest
arraylist collections (3)
En el siguiente código:
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
Me aparece el error:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Source does not fit in dest
at java.util.Collections.copy(Collections.java:548)
at backtracking2.Main.findSubsets(Main.java:61)
¿Por qué?
El constructor ArrayList(Collection<? extends E> c)
copiará todos los elementos de c
en la instancia recién creada, y numbersCopy
numbers
en numbersCopy
. Es lo mismo que numbersCopy.addAll(numbers)
también, que es realmente lo que necesita.
Tiene sentido que Collection.copy
requiera que la matriz de dest
sea lo suficientemente grande como para contener todos los elementos de la matriz de source
. Una analogía similar es la función C memcpy
y similares.
Esa es una muy buena pregunta y casi con seguridad tiene que ver con el hecho de que establecer una capacidad de recopilación no necesariamente asigna los objetos subyacentes, pero ¿por qué lo haces de esa manera cuando puedes simplemente:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
La capacidad no es igual al tamaño. El parámetro de tamaño que está pasando simplemente asigna suficiente memoria para el tamaño. En realidad, no define elementos. En realidad, es un requisito tonto de Collections.copy
, pero es uno de todos modos.
La parte clave de Collections.copy
JavaDocs :
La lista de destinos debe ser al menos tan larga como la lista fuente. Si es más largo, los elementos restantes en la lista de destinos no se verán afectados.
Simplemente debe pasar la List
al constructor ArrayList
para copiar toda la List
para evitar el problema por completo.