Saya menulis sendiri sebuah utilitas untuk memecah daftar menjadi beberapa ukuran. Saya hanya ingin tahu apakah sudah ada util apache commons untuk ini.
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;
}
Tolong beri tahu saya jika sudah ada utilitas yang sama.
java
collections
Harish
sumber
sumber
Jawaban:
Lihat dari Google Guava :
Lists.partition(java.util.List, int)
sumber
partition documentation
dan tautancode example
Jika Anda ingin menghasilkan aliran batch Java-8, Anda dapat mencoba kode berikut:
Keluaran:
sumber
Pendekatan lain adalah dengan menggunakan
Collectors.groupingBy
indeks dan kemudian memetakan indeks yang dikelompokkan ke elemen aktual:Keluaran:
sumber
groupingBy
dilakukan pada elemenIntStream.range
, bukan elemen daftar. Lihat misalnya ideone.com/KYBc7h .Saya datang dengan yang ini:
sumber
Dengan Java 9 Anda dapat menggunakan
IntStream.iterate()
denganhasNext
kondisi. Jadi, Anda dapat menyederhanakan kode metode Anda untuk ini:Menggunakan
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, hasil darigetBatches(numbers, 4)
akan:sumber
Contoh berikut menunjukkan pemotongan Daftar:
Keluaran:
sumber
Ada pertanyaan lain yang ditutup sebagai duplikat dari pertanyaan ini, tetapi jika Anda membacanya dengan cermat, itu agak berbeda. Jadi kalau-kalau seseorang (seperti saya) benar-benar ingin membagi daftar menjadi sejumlah daftar yang berukuran hampir sama , kemudian baca terus.
Saya hanya porting algoritma yang dijelaskan di sini ke Jawa.
sumber
Gunakan Apache Commons ListUtils.partition .
sumber
Menggunakan berbagai cheat dari web, saya sampai pada solusi ini:
Kami menggunakan hitungan untuk meniru indeks pengumpulan normal.
Kemudian, kami mengelompokkan elemen koleksi dalam ember, menggunakan hasil bagi aljabar sebagai nomor ember.
Peta akhir berisi sebagai kunci nomor ember, sebagai nilai ember itu sendiri.
Anda kemudian dapat dengan mudah melakukan operasi pada masing-masing ember dengan:
sumber
AtomicInteger
hitungan for.sumber
Mirip dengan OP tanpa aliran dan lib, tetapi lebih sadar:
sumber
Pendekatan lain untuk mengatasi ini, pertanyaan:
sumber
Satu kalimat di Java 8 adalah:
sumber
Berikut ini adalah solusi sederhana untuk Java 8+:
sumber
Anda dapat menggunakan kode di bawah ini untuk mendapatkan kumpulan daftar.
Anda perlu mengimpor perpustakaan Google Guava untuk menggunakan kode di atas.
sumber
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Gunakan Lists.partition (List, batchSize). Anda perlu mengimpor
Lists
dari paket umum google (com.google.common.collect.Lists
)Ini akan mengembalikan Daftar
List<T>
dengan dan ukuran setiap elemen sama dengan AndabatchSize
.sumber
subList(startIndex, endIndex)
metode mereka sendiri untuk memecahkan daftar berdasarkan indeks yang diperlukan.