Ich habe mir ein Dienstprogramm geschrieben, um eine Liste in Stapel mit einer bestimmten Größe aufzuteilen. Ich wollte nur wissen, ob es dafür bereits Apache Commons gibt.
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;
}
Bitte lassen Sie mich wissen, ob bereits ein Dienstprogramm für dasselbe vorhanden ist.
java
collections
Harish
quelle
quelle
Antworten:
Check out von Google Guava :
Lists.partition(java.util.List, int)
quelle
partition documentation
und Linkcode example
Wenn Sie einen Java-8-Stapelstrom erstellen möchten, können Sie den folgenden Code ausprobieren:
Ausgabe:
quelle
Ein anderer Ansatz besteht darin,
Collectors.groupingBy
Indizes zu verwenden und die gruppierten Indizes dann den tatsächlichen Elementen zuzuordnen:Ausgabe:
quelle
groupingBy
ist auf die Elemente der getanIntStream.range
, nicht die Listenelemente. Siehe z . B. ideone.com/KYBc7h .Ich habe mir das ausgedacht:
quelle
Mit Java 9 können Sie
IntStream.iterate()
mithasNext
Bedingung verwenden. So können Sie den Code Ihrer Methode folgendermaßen vereinfachen:Mit
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
wird das Ergebnis vongetBatches(numbers, 4)
sein:quelle
Das folgende Beispiel zeigt das Aufteilen einer Liste:
Ausgabe:
quelle
Es gab eine andere Frage , die als Duplikat dieser Frage geschlossen wurde, aber wenn Sie sie genau lesen, ist sie auf subtile Weise anders. Wenn also jemand (wie ich) tatsächlich eine Liste in eine bestimmte Anzahl von fast gleich großen Unterlisten aufteilen möchte , lesen Sie weiter.
Ich habe den hier beschriebenen Algorithmus einfach nach Java portiert .
quelle
Verwenden Sie Apache Commons ListUtils.partition .
quelle
Mit verschiedenen Cheats aus dem Internet kam ich zu dieser Lösung:
Wir verwenden count, um einen normalen Sammlungsindex nachzuahmen.
Anschließend gruppieren wir die Sammlungselemente in Buckets, wobei wir den algebraischen Quotienten als Bucket-Nummer verwenden.
Die endgültige Karte enthält als Schlüssel die Bucket-Nummer und als Wert den Bucket selbst.
Sie können dann einfach eine Operation an jedem der Eimer durchführen mit:
quelle
AtomicInteger
for count verwenden.quelle
Ähnlich wie OP ohne Streams und Bibliotheken, aber prägnanter:
quelle
Ein anderer Ansatz, um dies zu lösen, Frage:
quelle
Ein Einzeiler in Java 8 wäre:
quelle
Hier ist eine einfache Lösung für Java 8+:
quelle
Sie können den folgenden Code verwenden, um den Stapel der Liste zu erhalten.
Sie müssen die Google Guava-Bibliothek importieren, um den obigen Code verwenden zu können.
quelle
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Verwenden Sie Lists.partition (List, batchSize). Sie müssen
Lists
aus Google Common Package (com.google.common.collect.Lists
) importierenEs wird eine Liste von
List<T>
mit und die Größe jedes Elements zurückgegeben, die Ihrer entsprichtbatchSize
.quelle
subList(startIndex, endIndex)
Methode zum Aufbrechen der Liste basierend auf dem erforderlichen Index verwenden.