Gibt eine Ansicht des Teils dieser Liste zwischen den angegebenen fromIndex, inklusive und toIndexexklusiven zurück. (Wenn fromIndexund toIndexgleich sind, ist die zurückgegebene Liste leer.) Die zurückgegebene Liste wird von dieser Liste unterstützt, sodass nicht strukturelle Änderungen in der zurückgegebenen Liste in dieser Liste berücksichtigt werden und umgekehrt. Die zurückgegebene Liste unterstützt alle optionalen Listenoperationen, die von dieser Liste unterstützt werden.
Beispiel:
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]"
Wenn Sie diese gehackten Listen NICHT als Ansicht benötigen, erstellen Sie einfach eine neue Listaus dem subList. Hier ist ein Beispiel für die Zusammenstellung einiger dieser Dinge:
// 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!)
Ändern Sie die Quellliste, während Sie die Unterlisten durchlaufen, erhalten Sie eine gleichzeitige Ausnahme, da Java Doc-Statistiken: Die äußere Liste kann nicht geändert werden, spiegelt jedoch den neuesten Status der Quellliste wider. Die inneren Listen sind Unterlistenansichten der ursprünglichen Liste. Dies ist
Die Antwort von Polygenschmierstoffen teilt ein Array basierend auf der angegebenen Größe auf. Ich suchte nach Code, der ein Array in eine bestimmte Anzahl von Teilen aufteilt. Hier ist die Änderung, die ich am Code vorgenommen habe:
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;}
Bitte beachten Sie, dass dies einen Fehler hat, der den letzten Datensatz ignoriert. Ex 201, aufgeteilt in 100er-Stücke, gibt 100.100,0 statt 100.100,1 zurück
AAP
13
Java 8
Wir können eine Liste basierend auf einer bestimmten Größe oder basierend auf einer Bedingung aufteilen.
@i_am_zero Ist es möglich, mehrere Bedingungen anzuwenden (dritte statische Methode), sodass Sie mehrere Listen erstellen können, z. B. [[1,2,3,4], [5,6,7,8,9], [10,11,12 , 13,14]] unter Bedingungen: i <5, 5 <= i <10, i> = 10
gooornik07
2
@ gooornik07 ein stream kann nur einmal verwendet werden.
akhil_mittal
3
Ich vermute, dass das Problem darin besteht, 100 ArrayLists zu benennen und zu füllen. Sie können ein Array von ArrayLists erstellen und diese mit einer Schleife füllen.
Der einfachste (dümmste) Weg, dies zu tun, ist folgender:
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));}
Hauptsächlich können Sie Unterlisten verwenden. Weitere Details hier: Unterliste
Gibt eine Ansicht des Teils dieser Liste zwischen fromIndex (einschließlich) und toIndex (exklusiv) zurück. (Wenn fromIndex und toIndex gleich sind, ist die zurückgegebene Liste leer.) Die zurückgegebene Liste wird von dieser Liste unterstützt, sodass Änderungen in der zurückgegebenen Liste in dieser Liste berücksichtigt werden und umgekehrt. Die zurückgegebene Liste unterstützt alle optionalen Listenoperationen, die von dieser Liste unterstützt werden ...
Erstellen Sie eine neue Liste und fügen Sie mit der Methode addAll eine Unterlistenansicht der
Quellliste hinzu, um eine neue Unterlistenliste zu erstellen. NewList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
Sie können auch die FunctionalJava- Bibliothek verwenden - es gibt eine partitionMethode für List. Diese Bibliothek hat ihre eigenen Sammlungstypen. Sie können sie hin und her in Java-Sammlungen konvertieren.
Teilt dies Ihre Liste in 2 Listen oder 2 Werte pro Liste auf? Wenn Ihre ursprüngliche Liste beispielsweise 10 Elemente enthält, ergibt dies 2 Listen mit 5 oder 5 Listen mit 2.
@Jaafar: Ich möchte das gleiche wie, aber nachdem 20 Elemente geladen wurden, muss ich die nächsten 20 Elemente laden und so weiter. Bitte schlagen Sie mich dafür vor.
Vasantha
Hallo @vasantha Entschuldigung, ich habe deine Anfrage nicht früh gesehen, hast du es getan oder noch nicht?
B.JAAFAR
0
Nur um klar zu sein, das muss noch mehr getestet werden ...
**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)
Sie müssen die Blockgröße kennen, durch die Sie Ihre Liste teilen. Angenommen, Sie haben eine Liste von 108 entriesund Sie benötigen eine Blockgröße von 25. So erhalten Sie 5 lists:
4 mit 25 entriesjeweils;
1 (der fünfte) mit 8 elements.
Code:
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());}}
Antworten:
Sie können verwenden
subList(int fromIndex, int toIndex)
, um eine Ansicht eines Teils der ursprünglichen Liste zu erhalten.Aus der API:
Beispiel:
Wenn Sie diese gehackten Listen NICHT als Ansicht benötigen, erstellen Sie einfach eine neue
List
aus demsubList
. Hier ist ein Beispiel für die Zusammenstellung einiger dieser Dinge:quelle
Sie können die Guava- Bibliothek zu Ihrem Projekt hinzufügen und die Methode Lists.partition verwenden, z
quelle
Apache Commons Collections 4 verfügt über eine Partitionsmethode in der
ListUtils
Klasse. So funktioniert das:quelle
Die Antwort von Polygenschmierstoffen teilt ein Array basierend auf der angegebenen Größe auf. Ich suchte nach Code, der ein Array in eine bestimmte Anzahl von Teilen aufteilt. Hier ist die Änderung, die ich am Code vorgenommen habe:
Hoffe es hilft jemandem.
quelle
Das funktioniert bei mir
Z.B :
quelle
Java 8
Wir können eine Liste basierend auf einer bestimmten Größe oder basierend auf einer Bedingung aufteilen.
Dann können wir sie verwenden als:
quelle
Ich vermute, dass das Problem darin besteht, 100 ArrayLists zu benennen und zu füllen. Sie können ein Array von ArrayLists erstellen und diese mit einer Schleife füllen.
Der einfachste (dümmste) Weg, dies zu tun, ist folgender:
quelle
Eine ähnliche Frage wurde hier diskutiert, Java: Eine Liste in zwei Unterlisten aufteilen?
Hauptsächlich können Sie Unterlisten verwenden. Weitere Details hier: Unterliste
quelle
Beispiel
Ausgabe
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], .........
Sie werden in Ihrem Protokoll sehen
quelle
Sie können die
chunk
Methode aus Eclipse-Sammlungen verwenden :Einige Beispiele für die
chunk
Methode wurden ebenfalls in diesen DZone-Artikel aufgenommen .Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
Erstellen Sie eine neue Liste und fügen Sie mit der Methode addAll eine Unterlistenansicht der
Quellliste hinzu, um eine neue Unterlistenliste zu erstellen. NewList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
quelle
Sie können auch die FunctionalJava- Bibliothek verwenden - es gibt eine
partition
Methode fürList
. Diese Bibliothek hat ihre eigenen Sammlungstypen. Sie können sie hin und her in Java-Sammlungen konvertieren.quelle
quelle
Wenn Sie die Apache Commons-Bibliothek nicht importieren möchten, versuchen Sie diesen einfachen Code:
quelle
Nur um klar zu sein, das muss noch mehr getestet werden ...
quelle
Weitere Details: https://e.printstacktrace.blog/divide-a-list-to-lists-of-n-size-in-Java-8/
quelle
Sie müssen die Blockgröße kennen, durch die Sie Ihre Liste teilen. Angenommen, Sie haben eine Liste von
108 entries
und Sie benötigen eine Blockgröße von25
. So erhalten Sie5 lists
:25 entries
jeweils;8 elements
.Code:
quelle