Je me suis écrit un utilitaire pour diviser une liste en lots de taille donnée. Je voulais juste savoir s'il existe déjà un utilitaire apache commun pour cela.
public static <T> List<List<T>> getBatches(List<T> collection,int batchSize){
int i = 0;
List<List<T>> batches = new ArrayList<List<T>>();
while(i<collection.size()){
int nextInc = Math.min(collection.size()-i,batchSize);
List<T> batch = collection.subList(i,i+nextInc);
batches.add(batch);
i = i + nextInc;
}
return batches;
}
S'il vous plaît laissez-moi savoir s'il existe déjà un utilitaire existant pour le même.
java
collections
Harish
la source
la source
Réponses:
Vérifiez depuis Google Guava :
Lists.partition(java.util.List, int)
la source
partition documentation
et liencode example
Si vous souhaitez produire un flux Java-8 de lots, vous pouvez essayer le code suivant:
Production:
la source
Une autre approche consiste à utiliser
Collectors.groupingBy
des indices puis à mapper les indices groupés aux éléments réels:Production:
la source
groupingBy
se fait sur les éléments duIntStream.range
, pas sur les éléments de la liste. Voir par exemple ideone.com/KYBc7h .Je suis venu avec celui-ci:
la source
Avec Java 9, vous pouvez utiliser
IntStream.iterate()
avechasNext
condition. Vous pouvez donc simplifier le code de votre méthode à ceci:En utilisant
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, le résultat degetBatches(numbers, 4)
sera:la source
L'exemple suivant illustre la segmentation d'une liste:
Production:
la source
Il y avait une autre question qui a été fermée comme étant un double de celle-ci, mais si vous la lisez attentivement, elle est subtilement différente. Donc, au cas où quelqu'un (comme moi) voudrait réellement diviser une liste en un nombre donné de sous-listes de taille presque égale - , lisez la suite.
J'ai simplement porté l'algorithme décrit ici sur Java.
la source
Utilisez Apache Commons ListUtils.partition .
la source
En utilisant diverses astuces du Web, je suis arrivé à cette solution:
Nous utilisons count pour imiter un index de collection normal.
Ensuite, nous regroupons les éléments de la collection dans des compartiments, en utilisant le quotient algébrique comme numéro de compartiment.
La carte finale contient comme clé le numéro de compartiment, comme valeur le compartiment lui-même.
Vous pouvez alors effectuer facilement une opération sur chacun des buckets avec:
la source
AtomicInteger
pour compter.la source
Similaire à OP sans flux ni bibliothèques, mais concis:
la source
Une autre approche pour résoudre ce problème, question:
la source
Un one-liner dans Java 8 serait:
la source
Voici une solution simple pour Java 8+:
la source
Vous pouvez utiliser le code ci-dessous pour obtenir le lot de liste.
Vous devez importer la bibliothèque Google Guava pour utiliser le code ci-dessus.
la source
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Utilisez Lists.partition (List, batchSize). Vous devez importer à
Lists
partir du package commun google (com.google.common.collect.Lists
)Il renverra List of
List<T>
with et la taille de chaque élément égale à votrebatchSize
.la source
subList(startIndex, endIndex)
méthode pour casser la liste en fonction de l'index requis.