Escribí una utilidad para dividir una lista en lotes de un tamaño determinado. Solo quería saber si ya hay alguna utilidad de apache commons para esto.
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;
}
Avíseme si ya existe alguna utilidad para el mismo.
java
collections
Harish
fuente
fuente
Respuestas:
Echa un vistazo desde Google Guava :
Lists.partition(java.util.List, int)
fuente
partition documentation
y enlacecode example
En caso de que desee producir una secuencia de lotes Java-8, puede probar el siguiente código:
Salida:
fuente
Otro enfoque es utilizar
Collectors.groupingBy
índices y luego asignar los índices agrupados a los elementos reales:Salida:
fuente
groupingBy
se realiza en los elementos deIntStream.range
, no en los elementos de la lista. Ver, por ejemplo, ideone.com/KYBc7h .Se me ocurrió esta:
fuente
Con Java 9 puede usar
IntStream.iterate()
conhasNext
condición. Para que pueda simplificar el código de su método a esto:Usando
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, el resultado degetBatches(numbers, 4)
será:fuente
El siguiente ejemplo demuestra la fragmentación de una Lista:
Salida:
fuente
Hubo otra pregunta que se cerró como un duplicado de esta, pero si la lees detenidamente, es sutilmente diferente. Entonces, en caso de que alguien (como yo) realmente quiera dividir una lista en un número dado de sublistas de casi el mismo tamaño , leyendo.
Simplemente porté el algoritmo descrito aquí a Java.
fuente
Utilice Apache Commons ListUtils.partition .
fuente
Usando varios trucos de la web, llegué a esta solución:
Usamos count para imitar un índice de colección normal.
Luego, agrupamos los elementos de la colección en cubos, usando el cociente algebraico como número de cubo.
El mapa final contiene como clave el número del cubo, como valor el depósito en sí.
Luego puede realizar fácilmente una operación en cada uno de los cubos con:
fuente
AtomicInteger
para contar.fuente
Similar a OP sin streams y libs, pero conciser:
fuente
Otro enfoque para resolver esto, pregunta:
fuente
Una línea en Java 8 sería:
fuente
Aquí hay una solución simple para Java 8+:
fuente
Puede usar el siguiente código para obtener el lote de la lista.
Debe importar la biblioteca Google Guava para usar el código anterior.
fuente
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Use Lists.partition (List, batchSize). Necesita importar
Lists
desde el paquete común de google (com.google.common.collect.Lists
)Devolverá la Lista de
List<T>
con y el tamaño de cada elemento igual a subatchSize
.fuente
subList(startIndex, endIndex)
método para romper la lista según el índice requerido.