Napisałem sobie narzędzie do dzielenia listy na partie o określonej wielkości. Chciałem tylko wiedzieć, czy jest już do tego celu użyta jakaś wspólna apache.
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;
}
Daj mi znać, jeśli istnieje już jakieś narzędzie dla tego samego.
java
collections
Harish
źródło
źródło
Odpowiedzi:
Sprawdź z Google Guava :
Lists.partition(java.util.List, int)
źródło
partition documentation
i linkcode example
Jeśli chcesz utworzyć strumień partii Java-8, możesz wypróbować następujący kod:
Wynik:
źródło
Innym podejściem jest użycie
Collectors.groupingBy
indeksów, a następnie odwzorowanie zgrupowanych indeksów na rzeczywiste elementy:Wynik:
źródło
groupingBy
Odbywa się pierwiastków zIntStream.range
, a nie elementów listy. Zobacz np . Ideone.com/KYBc7h .Wymyśliłem ten:
źródło
Java 9 można skorzystać
IntStream.iterate()
zhasNext
warunku. Możesz więc uprościć kod swojej metody do tego:Używając
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, wynikiemgetBatches(numbers, 4)
będzie:źródło
Poniższy przykład ilustruje fragmentację listy:
Wynik:
źródło
Było jeszcze jedno pytanie, które zostało zamknięte jako duplikat tego, ale jeśli uważnie je przeczytasz, jest nieco inne. Jeśli więc ktoś (taki jak ja) rzeczywiście chce podzielić listę na określoną liczbę podlist o prawie równej wielkości , czytaj dalej.
Po prostu przeportowałem opisany tutaj algorytm na Javę.
źródło
Użyj Apache Commons ListUtils.partition .
źródło
Korzystając z różnych kodów z sieci, doszedłem do takiego rozwiązania:
Używamy count do naśladowania normalnego indeksu kolekcji.
Następnie grupujemy elementy kolekcji w segmenty, używając ilorazu algebraicznego jako numeru segmentu.
Ostateczna mapa zawiera jako klucz numer segmentu jako wartość samego segmentu.
Następnie możesz łatwo wykonać operację na każdym z wiader za pomocą:
źródło
AtomicInteger
liczyć.źródło
Podobny do OP bez strumieni i bibliotek, ale bardziej zwięzły:
źródło
Inne podejście do rozwiązania tego problemu, pytanie:
źródło
Jednowierszowy w Javie 8 byłby:
źródło
Oto proste rozwiązanie dla Java 8+:
źródło
Możesz użyć poniższego kodu, aby uzyskać partię listy.
Aby użyć powyższego kodu, musisz zaimportować bibliotekę Google Guava.
źródło
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Użyj Lists.partition (List, batchSize). Musisz zaimportować
Lists
ze wspólnego pakietu Google (com.google.common.collect.Lists
)Zwróci List of
List<T>
with i rozmiar każdego elementu równy twojemubatchSize
.źródło
subList(startIndex, endIndex)
metody podziału listy na podstawie wymaganego indeksu.