Retorna uma visualização da parte desta lista entre o especificado fromIndex, inclusivo e toIndexexclusivo. (Se fromIndexe toIndexfor igual, a lista retornada está vazia.) A lista retornada é apoiada por esta lista, portanto as alterações não estruturais na lista retornada são refletidas nessa lista e vice-versa. A lista retornada suporta todas as operações opcionais da lista suportadas por esta lista.
Exemplo:
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]"
Se você precisar que essas listas cortadas NÃO sejam uma visualização, basta criar uma nova a Listpartir do subList. Aqui está um exemplo de como juntar algumas dessas coisas:
// 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!)
modificar a lista de fontes, enquanto percorrer as sublistas, você receberá uma exceção simultânea, porque java doc stats: A lista externa não é modificável, mas reflete o estado mais recente da lista de fontes. As listas internas são vistas de sub-lista da lista original. Isto é #
A resposta fornecida pelos poligenelubricants divide uma matriz com base no tamanho especificado. Eu estava procurando por um código que dividisse uma matriz em um determinado número de partes. Aqui está a modificação que fiz no 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;}
@i_am_zero É possível aplicar várias condições (terceiro método estático) para criar várias listas ex [[1,2,3,4], [5,6,7,8,9], [10,11,12 , 13,14]] em condições: i <5, 5 <= i <10, i> = 10
gooornik07
2
@ gooornik07 um fluxo pode ser usado apenas uma vez.
akhil_mittal
3
Suponho que o problema que você está enfrentando é nomear 100 ArrayLists e preenchê-las. Você pode criar uma matriz de ArrayLists e preencher cada uma delas usando um loop.
A maneira mais simples (leia a mais estúpida) de fazer isso é assim:
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 você pode usar sublist. Mais detalhes aqui: subList
Retorna uma visualização da parte desta lista entre fromIndex, inclusive e toIndex, exclusivo. (Se fromIndex e toIndex forem iguais, a lista retornada estará vazia.) A lista retornada será apoiada por essa lista, portanto, as alterações na lista retornada serão refletidas nessa lista e vice-versa. A lista retornada suporta todas as operações opcionais da lista suportadas por esta lista ...
Crie uma nova lista e adicione a exibição de sub-lista da lista de origem usando o método addAll para criar uma nova
sub- lista List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
Você também pode usar a biblioteca FunctionalJava - existe um partitionmétodo para List. Essa biblioteca possui seus próprios tipos de coleção, você pode convertê-los em coleções java.
Isso está dividindo sua lista em 2 listas ou 2 valores por lista. Por exemplo, se a sua lista inicial era de 10 elementos faria esse rendimento 2 lista de 5 ou 5 listas de 2.
@ Jaafar: Eu quero o mesmo, mas depois de 20 elementos carregados, imprima novamente e preciso carregar os próximos 20 elementos e assim por diante. Então, por favor me sugerir para isso.
Vasantha
Oi @vasantha desculpe, eu não vi sua solicitação cedo, você fez ou não?
B.JAAFAR
0
Só para esclarecer, isso ainda precisa ser testado mais ...
**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)
Você precisa saber o tamanho do pedaço pelo qual está dividindo sua lista. Digamos que você tenha uma lista 108 entriese precise de um tamanho de bloco 25. Assim, você terminará com 5 lists:
4 tendo 25 entriescada um;
1 (o quinto) tendo 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());}}
Respostas:
Você pode usar
subList(int fromIndex, int toIndex)
para obter uma exibição de uma parte da lista original.Na API:
Exemplo:
Se você precisar que essas listas cortadas NÃO sejam uma visualização, basta criar uma nova a
List
partir dosubList
. Aqui está um exemplo de como juntar algumas dessas coisas:fonte
Você pode adicionar a biblioteca Guava ao seu projeto e usar o método Lists.partition , por exemplo
fonte
O Apache Commons Collections 4 possui um método de partição na
ListUtils
classe. Veja como funciona:fonte
A resposta fornecida pelos poligenelubricants divide uma matriz com base no tamanho especificado. Eu estava procurando por um código que dividisse uma matriz em um determinado número de partes. Aqui está a modificação que fiz no código:
Espero que ajude alguém.
fonte
Isso funciona para mim
Por exemplo :
fonte
Java 8
Podemos dividir uma lista com base em algum tamanho ou com base em uma condição.
Então podemos usá-los como:
fonte
Suponho que o problema que você está enfrentando é nomear 100 ArrayLists e preenchê-las. Você pode criar uma matriz de ArrayLists e preencher cada uma delas usando um loop.
A maneira mais simples (leia a mais estúpida) de fazer isso é assim:
fonte
Uma pergunta semelhante foi discutida aqui, Java: dividir uma lista em duas sub-listas?
Principalmente você pode usar sublist. Mais detalhes aqui: subList
fonte
Exemplo
Resultado
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], .........
você verá no seu log
fonte
Você pode usar o
chunk
método em Coleções do Eclipse :Alguns exemplos do
chunk
método também foram incluídos neste artigo do DZone .Nota: Sou um colaborador das Coleções Eclipse.
fonte
Crie uma nova lista e adicione a exibição de sub-lista da lista de origem usando o método addAll para criar uma nova
sub- lista List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
fonte
Você também pode usar a biblioteca FunctionalJava - existe um
partition
método paraList
. Essa biblioteca possui seus próprios tipos de coleção, você pode convertê-los em coleções java.fonte
fonte
se você não deseja importar a biblioteca apache commons, tente este código simples:
fonte
Só para esclarecer, isso ainda precisa ser testado mais ...
fonte
mais detalhes: https://e.printstacktrace.blog/divide-a-list-to-lists-of-n-size-in-Java-8/
fonte
Você precisa saber o tamanho do pedaço pelo qual está dividindo sua lista. Digamos que você tenha uma lista
108 entries
e precise de um tamanho de bloco25
. Assim, você terminará com5 lists
:25 entries
cada um;8 elements
.Código:
fonte