Zwraca widok części tej listy między podaną fromIndex, włącznie i toIndexwyłączną. (Jeśli fromIndexi toIndexsą równe, zwrócona lista jest pusta). Zwrócona lista jest poparta tą listą, więc zmiany niestrukturalne na zwróconej liście są odzwierciedlone na tej liście i odwrotnie. Zwrócona lista obsługuje wszystkie opcjonalne operacje na liście obsługiwane przez tę listę.
Przykład:
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]"
Jeśli potrzebujesz, aby te posiekane listy NIE były widokiem, po prostu utwórz nową Listz subList. Oto przykład połączenia kilku z tych rzeczy:
// 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!)
zmodyfikuj listę źródłową, podczas gdy przeglądaj podlisty, otrzymasz współbieżny wyjątek, ponieważ statystyki java doc: Zewnętrzna lista jest niemodyfikowalna, ale odzwierciedla najnowszy stan listy źródłowej. Wewnętrzne listy są widokami sublistycznymi oryginalnej listy. To jest
Odpowiedź dostarczona przez polygenelubricants dzieli tablicę na podstawie podanego rozmiaru. Szukałem kodu, który podzieli tablicę na określoną liczbę części. Oto modyfikacja, którą zrobiłem w kodzie:
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 Czy można zastosować wiele warunków (trzecia metoda statyczna), aby można było utworzyć wiele list, np. [1,2,3,4], [5,6,7,8,9], [10,11,12 , 13,14]] na warunkach: i <5, 5 <= i <10, i> = 10
gooornik07
2
@ gooornik07 strumienia można użyć tylko raz.
akhil_mittal
3
Zgaduję, że masz problem z nazwaniem 100 ArrayLists i zapełnieniem ich. Możesz utworzyć tablicę ArrayLists i wypełnić każdą z nich za pomocą pętli.
Najprostszym (najgłupszym) sposobem na zrobienie tego jest:
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));}
Głównie możesz użyć listy podrzędnej. Więcej informacji tutaj: subList
Zwraca widok części tej listy między fromIndex, włącznie, i toIndex, wyłączną. (Jeśli wartości fromIndex i toIndex są równe, zwrócona lista jest pusta). Zwrócona lista jest wspierana przez tę listę, więc zmiany na zwróconej liście są odzwierciedlane na tej liście i odwrotnie. Zwrócona lista obsługuje wszystkie opcjonalne operacje na liście obsługiwane przez tę listę ...
Utwórz nową listę i dodaj widok listy źródłowej listy źródłowej za pomocą metody addAll, aby utworzyć nową
listę podrzędną List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
Możesz także użyć biblioteki FunctionalJava - istnieje partitionmetoda List. Ta biblioteka ma swoje własne typy kolekcji, możesz konwertować je na kolekcje java tam iz powrotem.
@Jaafar: Chcę to samo, ale po załadowaniu 20 elementów do druku, muszę ponownie załadować kolejne 20 elementów i tak dalej. Więc proszę zasugeruj mi to.
vasantha
Cześć @vasantha Przepraszam, że nie widziałem Twojej prośby wcześniej, zrobiłeś to czy jeszcze nie?
B.JAAFAR
0
Żeby było jasne, wciąż trzeba to przetestować więcej ...
**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)
Musisz znać wielkość porcji, przez którą dzielisz listę. Załóżmy, że masz listę 108 entriesi potrzebujesz rozmiaru fragmentu 25. W ten sposób skończysz z 5 lists:
4 mając 25 entries każdy;
1 (piąty) posiadający 8 elements.
Kod:
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());}}
Odpowiedzi:
Możesz użyć,
subList(int fromIndex, int toIndex)
aby uzyskać widok części oryginalnej listy.Z interfejsu API:
Przykład:
Jeśli potrzebujesz, aby te posiekane listy NIE były widokiem, po prostu utwórz nową
List
zsubList
. Oto przykład połączenia kilku z tych rzeczy:źródło
Możesz dodać bibliotekę Guava do swojego projektu i użyć metody Lists.partition , np
źródło
Apache Commons Collections 4 ma metodę podziału w
ListUtils
klasie. Oto jak to działa:źródło
Odpowiedź dostarczona przez polygenelubricants dzieli tablicę na podstawie podanego rozmiaru. Szukałem kodu, który podzieli tablicę na określoną liczbę części. Oto modyfikacja, którą zrobiłem w kodzie:
Mam nadzieję, że to komuś pomoże.
źródło
To działa dla mnie
Np .:
źródło
Java 8
Możemy podzielić listę na podstawie wielkości lub warunku.
Następnie możemy użyć ich jako:
źródło
Zgaduję, że masz problem z nazwaniem 100 ArrayLists i zapełnieniem ich. Możesz utworzyć tablicę ArrayLists i wypełnić każdą z nich za pomocą pętli.
Najprostszym (najgłupszym) sposobem na zrobienie tego jest:
źródło
Podobne pytanie zostało omówione tutaj, Java: podzielić Listę na dwie podlisty?
Głównie możesz użyć listy podrzędnej. Więcej informacji tutaj: subList
źródło
Przykład
Wynik
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], .........
zobaczysz w swoim dzienniku
źródło
Możesz użyć
chunk
metody z kolekcji Eclipse :Kilka przykładów tej
chunk
metody zostało również zawartych w tym artykule DZone .Uwaga: jestem osobą odpowiedzialną za kolekcje Eclipse.
źródło
Utwórz nową listę i dodaj widok listy źródłowej listy źródłowej za pomocą metody addAll, aby utworzyć nową
listę podrzędną List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
źródło
Możesz także użyć biblioteki FunctionalJava - istnieje
partition
metodaList
. Ta biblioteka ma swoje własne typy kolekcji, możesz konwertować je na kolekcje java tam iz powrotem.źródło
źródło
jeśli nie chcesz importować biblioteki apache commons, wypróbuj ten prosty kod:
źródło
Żeby było jasne, wciąż trzeba to przetestować więcej ...
źródło
więcej szczegółów: https://e.printstacktrace.blog/divide-a-list-to-lists-of-n-size-in-Java-8/
źródło
Musisz znać wielkość porcji, przez którą dzielisz listę. Załóżmy, że masz listę
108 entries
i potrzebujesz rozmiaru fragmentu25
. W ten sposób skończysz z5 lists
:25 entries
każdy;8 elements
.Kod:
źródło