Sur le code suivant:
static void findSubsets (ArrayList<Integer> numbers, int amount, int index)
{
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers.size());
Collections.copy(numbersCopy, numbers);
}
Je reçois l'erreur:
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)
Pourquoi?
La capacité n'est pas égale à la taille. Le paramètre de taille que vous transmettez alloue simplement suffisamment de mémoire pour la taille. Il ne définit pas réellement d'éléments. C'est en fait une sorte d'exigence idiote de Collections.copy
, mais c'est quand même un.
La partie clé de la Collections.copy
JavaDocs :
La liste de destination doit être au moins aussi longue que la liste source. S'il est plus long, les éléments restants de la liste de destination ne sont pas affectés.
Vous devez simplement passer le List
au constructeur de ArrayList
pour copier tout le List
pour éviter complètement le problème.
C'est une très bonne question et cela a certainement à voir avec le fait que la définition d'une capacité de collections n'alloue pas nécessairement les objets sous-jacents, mais pourquoi le faites-vous de cette façon alors que vous pouvez simplement:
ArrayList <Integer> numbersCopy = new ArrayList<Integer>(numbers);
Le constructeur ArrayList(Collection<? extends E> c)
copiera tous les éléments de c
dans la nouvelle instance créée, copiant ainsi numbers
dans numbersCopy
. C'est la même chose que numbersCopy.addAll(numbers)
également, ce qui est vraiment ce dont vous avez besoin.
Il est logique que Collection.copy
requiert que le tableau dest
soit suffisamment grand pour contenir tous les éléments du tableau source
. Une analogie similaire est la fonction C memcpy
et similaires.
Lors de la création d'un ArrayList
pour copier un autre ArrayList
à l'aide de la méthode Collections.copy()
, nous devons nous assurer que la destination List
contient le même nombre de valeurs (pas seulement même taille) que la source List
. Par exemple, si la source ArrayList
a des valeurs [Rouge, Bleu, Vert], alors la destination ArrayList
doit également contenir le même nombre d'éléments comme [Orange, Jaune, Bleu]. Si nous créons un ArrayList
avec la même taille que la source ArrayList
, il donnera OutOfBounds
exception.