web-dev-qa-db-fra.com

Comment puis-je découper une ArrayList sur une ArrayList en Java?

Comment obtenir une tranche de tableau d'une ArrayList en Java? Plus précisément, je veux faire quelque chose comme ça: 

ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>

Je pensais donc que cela fonctionnerait, mais Java renvoie une List - donc c'est incompatible. Et quand j'essaye de le lancer, Java ne me le permet pas. J'ai besoin d'une ArrayList - que puis-je faire?

61
B T

En Java, il est recommandé d’utiliser des types d’interface plutôt que des classes concrètes dans les API.

Votre problème est que vous utilisez ArrayList (probablement dans beaucoup d'endroits) où vous devriez vraiment utiliser List. En conséquence, vous vous êtes créé des problèmes avec une contrainte inutile que la liste est une ArrayList.

Voici à quoi votre code devrait ressembler:

List input = new ArrayList(...);

public void doSomething(List input) {
   List inputA = input.subList(0, input.size()/2);
   ...
}

this.doSomething(input);

Votre "solution" proposée au problème était/est-ce:

new ArrayList(input.subList(0, input.size()/2))

Cela fonctionne en faisant une copie de la sous-liste. Ce n'est pas une tranche au sens habituel. De plus, si la sous-liste est volumineuse, la copie sera coûteuse.


Si vous êtes limité par des API que vous ne pouvez pas modifier , de sorte que vous devez déclarer inputA en tant que ArrayList, vous pourrez peut-être implémenter une sous-classe personnalisée de ArrayList dans laquelle la méthode subList renvoie une sous-classe de ArrayList. Toutefois:

  1. Il faudrait beaucoup de travail pour concevoir, mettre en œuvre et tester.
  2. Vous avez maintenant ajouté une nouvelle classe significative à votre base de code, éventuellement avec des dépendances d'aspects non documentés (et donc "sujets à modification") de la classe ArrayList.
  3. Vous devrez modifier les emplacements pertinents de votre base de code où vous créez des instances ArrayList pour créer des instances de votre sous-classe.

La solution "copier le tableau" est plus pratique ... gardant à l'esprit que ce ne sont pas de vraies tranches.

99
Stephen C

S'il n'y a pas de méthode existante, je suppose que vous pouvez itérer de 0 à input.size()/2, en prenant chaque élément consécutif et en l'ajoutant à un nouvel ArrayList.

EDIT: En fait, je pense que vous pouvez utiliser cette liste et l'utiliser pour instancier une nouvelle ArrayList en utilisant l'un des constructeurs ArrayList .

6
Jorge Israel Peña

J'ai trouvé un moyen, si vous connaissez startIndex et endIndex, des éléments à supprimer de ArrayList.

Soit al le ArrayList d'origine et startIndex, endIndex les index de début et de fin à supprimer du tableau respectivement:

al.subList(startIndex, endIndex + 1).clear();
4
Aman Gupta

Bien que ce post soit très vieux. Dans le cas où quelqu'un cherche cela ..

Guava facilite le partitionnement de la liste en sous-listes d'une taille spécifiée

List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
    List<List<Integer>> subSets = Lists.partition(intList, 3);
0
Hari Rao