Est a t-il un utilitaire Java pour briser une liste en lots?
Je l'ai écrit moi-même un utilitaire pour briser une liste en lots de taille donnée. Je voulais juste savoir si il y a déjà tout d'apache commons util 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 y a un utilitaire existant déjà pour les mêmes.
- Pas sûr que c'est hors-sujet. La question n'est pas "ce que la bibliothèque n'est ce" mais "comment puis-je le faire avec apache commune utils".
- Je suis d'accord avec vous. Cette question et ses réponses sont très utiles, et il se pourrait bien enregistré avec une petite modification. C'était un paresseux action de proximité à la hâte.
Vous devez vous connecter pour publier un commentaire.
Découvrez
Listes.partition(java.util.Liste, int)
de Google Goyave:partition documentation
et liencode example
Dans le cas où vous souhaitez produire un Java-8 flux de lots, vous pouvez essayer le code suivant:
De sortie:
Une autre approche consiste à utiliser
Collectors.groupingBy
des indices et puis la carte groupées des indices pour les éléments réels:De sortie:
groupingBy
est fait sur les éléments de laIntStream.range
, pas les éléments de la liste. Voir, par exemple, ideone.com/KYBc7h.Je suis venu avec celui-ci:
L'exemple suivant illustre la segmentation d'une Liste:
De sortie:
À l'aide de différents cheats sur le web, je suis venu à cette solution:
Nous utilisons le comte d'imiter une collection normale de l'indice.
Ensuite, on regroupe les éléments de la collection dans des seaux, à l'aide de la algébrique quotient comme seau nombre.
La carte finale contient que clé le seau nombre, comme valeur le seau lui-même.
Vous pouvez facilement faire une opération sur chacun des seaux avec:
AtomicInteger
pour le comte.Il y avait une autre question qui a été fermé comme étant un doublon de celui-ci, mais si vous le lisez attentivement, il est subtilement différent. Donc, au cas où quelqu'un (comme moi), en fait, veut diviser la liste en un nombre de près de même taille des sous-listes, alors lisez la suite.
J'ai simplement porté à l'algorithme décrit ici à Java.
Avec Java 9, vous pouvez utiliser
IntStream.iterate()
avechasNext
condition. De sorte que vous pouvez simplifier le code de votre méthode pour cela:À l'aide de
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, le résultat degetBatches(numbers, 4)
sera:L'Utilisation D'Apache Commons ListUtils.partition.
Une autre approche pour résoudre cette question:
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Utiliser Des Listes.partition(Liste,batchSize). Vous avez besoin d'importer
Lists
de google package commun (com.google.common.collect.Lists
)Il sera de retour la Liste de
List<T>
avec et la taille de chaque élément est égal à votrebatchSize
.subList(startIndex, endIndex)
méthode pour briser liste basée sur les index requis.Un one-liner en Java 8 serait: