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?
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:
ArrayList
.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.
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 .
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();
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);