Devuelve una vista de la parte de esta lista entre lo especificado fromIndex, inclusivo y toIndexexclusivo. (Si fromIndexy toIndexson iguales, la lista devuelta está vacía.) La lista devuelta está respaldada por esta lista, por lo que los cambios no estructurales en la lista devuelta se reflejan en esta lista, y viceversa. La lista devuelta admite todas las operaciones de lista opcionales admitidas por esta lista.
Ejemplo:
List<Integer> numbers =newArrayList<Integer>(Arrays.asList(5,3,1,2,9,5,0,7));List<Integer> head = numbers.subList(0,4);List<Integer> tail = numbers.subList(4,8);System.out.println(head);// prints "[5, 3, 1, 2]"System.out.println(tail);// prints "[9, 5, 0, 7]"Collections.sort(head);System.out.println(numbers);// prints "[1, 2, 3, 5, 9, 5, 0, 7]"
tail.add(-1);System.out.println(numbers);// prints "[1, 2, 3, 5, 9, 5, 0, 7, -1]"
Si necesita que estas listas cortadas NO sean una vista, simplemente cree una nueva Listdesde subList. Aquí hay un ejemplo de poner algunas de estas cosas juntas:
// chops a list into non-view sublists of length Lstatic<T>List<List<T>> chopped(List<T> list,finalint L){List<List<T>> parts =newArrayList<List<T>>();finalint N = list.size();for(int i =0; i < N; i += L){
parts.add(newArrayList<T>(
list.subList(i,Math.min(N, i + L))));}return parts;}List<Integer> numbers =Collections.unmodifiableList(Arrays.asList(5,3,1,2,9,5,0,7));List<List<Integer>> parts = chopped(numbers,3);System.out.println(parts);// prints "[[5, 3, 1], [2, 9, 5], [0, 7]]"
parts.get(0).add(-1);System.out.println(parts);// prints "[[5, 3, 1, -1], [2, 9, 5], [0, 7]]"System.out.println(numbers);// prints "[5, 3, 1, 2, 9, 5, 0, 7]" (unmodified!)
modifique la lista fuente, mientras recorre las sublistas, obtendrá una excepción concurrente, ya que java doc stats: la lista externa no se puede modificar, pero refleja el último estado de la lista fuente. Las listas internas son vistas de sublista de la lista original. Esto es
La respuesta proporcionada por polygenelubricants divide una matriz basada en el tamaño dado. Estaba buscando un código que dividiría una matriz en un número dado de partes. Aquí está la modificación que hice al código:
publicstatic<T>List<List<T>> chopIntoParts(finalList<T> ls,finalint iParts ){finalList<List<T>> lsParts =newArrayList<List<T>>();finalint iChunkSize = ls.size()/ iParts;int iLeftOver = ls.size()% iParts;int iTake = iChunkSize;for(int i =0, iT = ls.size(); i < iT; i += iTake ){if( iLeftOver >0){
iLeftOver--;
iTake = iChunkSize +1;}else{
iTake = iChunkSize;}
lsParts.add(newArrayList<T>( ls.subList( i,Math.min( iT, i + iTake ))));}return lsParts;}
/**
* Returns List of the List argument passed to this function with size = chunkSize
*
* @param largeList input list to be portioned
* @param chunkSize maximum size of each partition
* @param <T> Generic type of the List
* @return A list of Lists which is portioned from the original list
*/publicstatic<T>List<List<T>> chunkList(List<T> list,int chunkSize){if(chunkSize <=0){thrownewIllegalArgumentException("Invalid chunk size: "+ chunkSize);}List<List<T>> chunkList =newArrayList<>(list.size()/ chunkSize);for(int i =0; i < list.size(); i += chunkSize){
chunkList.add(list.subList(i, i + chunkSize >= list.size()? list.size()-1: i + chunkSize));}return chunkList;}
tenga en cuenta que esto tiene un error que ignora el último conjunto de datos. ex 201 dividido en trozos de 100s devolverá 100,100,0 en lugar de 100,100,1
AAP
13
Java 8
Podemos dividir una lista en función de algún tamaño o en función de una condición.
@i_am_zero ¿Es posible aplicar múltiples condiciones (tercer método estático) para poder crear múltiples listas ex [[1,2,3,4], [5,6,7,8,9], [10,11,12 , 13,14]] en condiciones: i <5, 5 <= i <10, i> = 10
gooornik07
2
@ gooornik07 una secuencia solo se puede usar una vez.
akhil_mittal
3
Supongo que el problema que tienes es nombrar 100 ArrayLists y completarlas. Puede crear una matriz de ArrayLists y completar cada una de ellas mediante un bucle.
La forma más simple (más estúpida) de hacer esto es así:
ArrayList results =newArrayList(1000);// populate results herefor(int i =0; i <1000; i++){
results.add(i);}ArrayList[] resultGroups =newArrayList[100];// initialize all your small ArrayList groupsfor(int i =0; i <100; i++){
resultGroups[i]=newArrayList();}// put your results into those arraysfor(int i =0; i <1000; i++){
resultGroups[i/10].add(results.get(i));}
Principalmente puedes usar sublista. Más detalles aquí: subList
Devuelve una vista de la parte de esta lista entre fromIndex, inclusive, y toIndex, exclusive. (Si fromIndex y toIndex son iguales, la lista devuelta está vacía). La lista devuelta está respaldada por esta lista, por lo que los cambios en la lista devuelta se reflejan en esta lista, y viceversa. La lista devuelta admite todas las operaciones de lista opcionales admitidas por esta lista ...
Cree una nueva lista y agregue una vista de sublista de la lista de origen usando el método addAll para crear una nueva sublista
List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
También puede usar la biblioteca FunctionalJava , hay un partitionmétodo para List. Esta biblioteca tiene sus propios tipos de colección, puede convertirlos en colecciones de Java de un lado a otro.
¿Está dividiendo su lista en 2 Listas o 2 valores por Lista? Por ejemplo, si su lista inicial fuera de 10 elementos, esto generaría 2 listas de 5 o 5 listas de 2.
@Jaafar: Quiero lo mismo, pero después de 20 elementos cargados de impresión, nuevamente necesito cargar los siguientes 20 elementos, etc. Así que por favor sugiéreme para esto.
vasantha
Hola @vasantha lo siento, no vi tu solicitud antes, ¿lo hiciste o no?
B.JAAFAR
0
Para ser claros, esto todavía tiene que ser probado más ...
**Divide a list to lists of n size**import java.util.AbstractList;import java.util.ArrayList;import java.util.List;publicfinalclassPartitionUtil<T>extendsAbstractList<List<T>>{privatefinalList<T> list;privatefinalint chunkSize;privatePartitionUtil(List<T> list,int chunkSize){this.list =newArrayList<>(list);this.chunkSize = chunkSize;}publicstatic<T>PartitionUtil<T> ofSize(List<T> list,int chunkSize){returnnewPartitionUtil<>(list, chunkSize);}@OverridepublicList<T> get(int index){int start = index * chunkSize;int end =Math.min(start + chunkSize, list.size());if(start > end){thrownewIndexOutOfBoundsException("Index "+ index +" is out of the list range <0,"+(size()-1)+">");}returnnewArrayList<>(list.subList(start, end));}@Overridepublicint size(){return(int)Math.ceil((double) list.size()/(double) chunkSize);}}Function call :List<List<String>> containerNumChunks =PartitionUtil.ofSize(list,999)
Necesita saber el tamaño del fragmento por el cual está dividiendo su lista. Digamos que tiene una lista de 108 entriesy necesita un tamaño de fragmento de 25. Así terminarás con 5 lists:
4 teniendo 25 entriescada uno;
1 (el quinto) que tiene 8 elements.
Código:
publicstaticvoid main(String[] args){List<Integer> list =newArrayList<Integer>();for(int i=0; i<108; i++){
list.add(i);}int size= list.size();int j=0;List<List<Integer>> splittedList =newArrayList<List<Integer>>();List<Integer> tempList =newArrayList<Integer>();for(j=0;j<size;j++){
tempList.add(list.get(j));if((j+1)%25==0){// chunk of 25 created and clearing tempList
splittedList.add(tempList);
tempList =null;//intializing it again for new chunk
tempList =newArrayList<Integer>();}}if(size%25!=0){//adding the remaining enteries
splittedList.add(tempList);}for(int k=0;k<splittedList.size(); k++){//(k+1) because we started from k=0System.out.println("Chunk number: "+(k+1)+" has elements = "+splittedList.get(k).size());}}
Respuestas:
Puedes usar
subList(int fromIndex, int toIndex)
para obtener una vista de una parte de la lista original.De la API:
Ejemplo:
Si necesita que estas listas cortadas NO sean una vista, simplemente cree una nueva
List
desdesubList
. Aquí hay un ejemplo de poner algunas de estas cosas juntas:fuente
Puede agregar la biblioteca Guava a su proyecto y utilizar el método Lists.partition , p. Ej.
fuente
Apache Commons Collections 4 tiene un método de partición en la
ListUtils
clase. Así es como funciona:fuente
La respuesta proporcionada por polygenelubricants divide una matriz basada en el tamaño dado. Estaba buscando un código que dividiría una matriz en un número dado de partes. Aquí está la modificación que hice al código:
Espero que ayude a alguien.
fuente
Esto funciona para mi
P.ej :
fuente
Java 8
Podemos dividir una lista en función de algún tamaño o en función de una condición.
Entonces podemos usarlos como:
fuente
Supongo que el problema que tienes es nombrar 100 ArrayLists y completarlas. Puede crear una matriz de ArrayLists y completar cada una de ellas mediante un bucle.
La forma más simple (más estúpida) de hacer esto es así:
fuente
Aquí se discutió una pregunta similar, Java: ¿dividir una Lista en dos sublistas?
Principalmente puedes usar sublista. Más detalles aquí: subList
fuente
Ejemplo
Salida
CHUNKED :: [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21 , 22, 23, 24, 25, 26, 27, 28, 29, 30], [31, 32, 33, 34, 35, 36, 37, 38, 39, 40], [41, 42, 43, 44 , 45, 46, 47, 48, 49, 50], [51, 52, 53, 54, 55, 56, 57, 58, 59, 60], [61, 62, 63, 64, 65, 66, 67 , 68, 69, 70], [71, 72, 73, 74, 75, 76, 77, 78, 79, 80], [81, 82, 83, 84, 85, 86, 87, 88, 89, 90 ], [91, 92, 93, 94, 95, 96, 97, 98, 99, 100], .........
verás en tu registro
fuente
Puede usar el
chunk
método de Eclipse Collections :También
chunk
se incluyeron algunos ejemplos del método en este artículo de DZone .Nota: Soy un committer para Eclipse Collections.
fuente
Cree una nueva lista y agregue una vista de sublista de la lista de origen usando el método addAll para crear una nueva sublista
List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
fuente
También puede usar la biblioteca FunctionalJava , hay un
partition
método paraList
. Esta biblioteca tiene sus propios tipos de colección, puede convertirlos en colecciones de Java de un lado a otro.fuente
fuente
si no quieres importar la biblioteca de apache commons prueba este código simple:
fuente
Para ser claros, esto todavía tiene que ser probado más ...
fuente
Más detalles: https://e.printstacktrace.blog/divide-a-list-to-lists-of-n-size-in-Java-8/
fuente
Necesita saber el tamaño del fragmento por el cual está dividiendo su lista. Digamos que tiene una lista de
108 entries
y necesita un tamaño de fragmento de25
. Así terminarás con5 lists
:25 entries
cada uno;8 elements
.Código:
fuente