Возвращает представление части этого списка между указанным fromIndex, включающим и toIndexисключающим. (Если fromIndexи toIndexравны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращаемом списке отражаются в этом списке, и наоборот. Возвращенный список поддерживает все необязательные операции списка, поддерживаемые этим списком.
Пример:
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]"
Если вам нужно, чтобы эти нарезанные списки НЕ были представлением, просто создайте новый Listиз subList. Вот пример объединения нескольких из этих вещей:
// 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!)
измените список источников, пока вы просматриваете подсписки, вы получите параллельное исключение, потому что статистика java doc: внешний список неизменяем, но отражает последнее состояние списка источников. Внутренние списки являются представлениями подсписка исходного списка. Это
Ответ, предоставленный полигенасыщенными смазочными материалами, разбивает массив на основе заданного размера. Я искал код, который разбил бы массив на определенное количество частей. Вот модификация, которую я сделал для кода:
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;}
Пожалуйста, обратите внимание, что это ошибка, что он игнорирует последний набор данных. бывший 201, разбитый на куски 100-х, вернет 100 100,0 вместо 100 100,1
AAP
13
Java 8
Мы можем разделить список по размеру или по условию.
@i_am_zero Возможно ли применить несколько условий (третий статический метод), чтобы вы могли создавать несколько списков, например [[1,2,3,4], [5,6,7,8,9], [10,11,12 , 13,14]] на условиях: i <5, 5 <= i <10, i> = 10
gooornik07
2
@ gooornik07 поток может быть использован только один раз.
akhil_mittal
3
Я предполагаю, что проблема в том, что вы называете 100 ArrayLists и заполняете их. Вы можете создать массив ArrayLists и заполнить каждый из них с помощью цикла.
Самый простой (читай глупейший) способ сделать это так:
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));}
В основном вы можете использовать подсписок. Подробнее здесь: subList
Возвращает представление части этого списка между fromIndex, inclusive и toIndex, exclusive. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому изменения в возвращаемом списке отражаются в этом списке, и наоборот. Возвращенный список поддерживает все необязательные операции списка, поддерживаемые этим списком ...
Создайте новый список и добавьте представление подсписка списка источников, используя метод addAll для создания нового подсписка
List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
Вы также можете использовать библиотеку FunctionalJava - есть partitionметод для List. Эта библиотека имеет свои собственные типы коллекций, вы можете конвертировать их в коллекции Java туда и обратно.
Это разбивает ваш список на 2 списка или 2 значения в списке. Например, если бы ваш первоначальный список состоял из 10 элементов, это дало бы 2 списка из 5 или 5 списков из 2.
@Jaafar: Я хочу то же самое, но после загрузки 20 элементов, затем снова мне нужно загрузить следующие 20 элементов и так далее. Поэтому, пожалуйста, предложите мне это.
vasantha
Привет @ vasantha извините, я не видел ваш запрос рано, вы сделали это или нет?
B.JAAFAR
0
Просто чтобы быть ясно, это еще предстоит проверить больше ...
**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)
Вам нужно знать размер куска, на который вы делите свой список. Скажем, у вас есть список, 108 entriesи вам нужен размер куска 25. Таким образом, вы получите 5 lists:
4 с 25 entriesкаждым;
1 (пятый), имеющий 8 elements.
Код:
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());}}
Ответы:
Ты можешь использовать
subList(int fromIndex, int toIndex)
для просмотра части исходного списка.Из API:
Пример:
Если вам нужно, чтобы эти нарезанные списки НЕ были представлением, просто создайте новый
List
изsubList
. Вот пример объединения нескольких из этих вещей:источник
Вы можете добавить библиотеку Guava в свой проект и использовать метод Lists.partition , например:
источник
Apache Commons Collections 4 имеет метод разделения в
ListUtils
классе. Вот как это работает:источник
Ответ, предоставленный полигенасыщенными смазочными материалами, разбивает массив на основе заданного размера. Я искал код, который разбил бы массив на определенное количество частей. Вот модификация, которую я сделал для кода:
Надеюсь, это кому-нибудь поможет.
источник
Это работает для меня
Например:
источник
Java 8
Мы можем разделить список по размеру или по условию.
Тогда мы можем использовать их как:
источник
Я предполагаю, что проблема в том, что вы называете 100 ArrayLists и заполняете их. Вы можете создать массив ArrayLists и заполнить каждый из них с помощью цикла.
Самый простой (читай глупейший) способ сделать это так:
источник
Подобный вопрос обсуждался здесь, Java: разбить список на два подсписка?
В основном вы можете использовать подсписок. Подробнее здесь: subList
источник
пример
Вывод
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], .........
вы увидите в своем журнале
источник
Вы можете использовать
chunk
метод из Eclipse Collections :Несколько примеров
chunk
метода были включены в эту статью DZone .Примечание: я являюсь коммиттером для Eclipse Collections.
источник
Создайте новый список и добавьте представление подсписка списка источников, используя метод addAll для создания нового подсписка
List newList = new ArrayList (); newList.addAll (sourceList.subList (startIndex, endIndex));
источник
Вы также можете использовать библиотеку FunctionalJava - есть
partition
метод дляList
. Эта библиотека имеет свои собственные типы коллекций, вы можете конвертировать их в коллекции Java туда и обратно.источник
источник
если вы не хотите импортировать библиотеку Apache Commons, попробуйте следующий простой код:
источник
Просто чтобы быть ясно, это еще предстоит проверить больше ...
источник
более подробная информация: https://e.printstacktrace.blog/divide-a-list-to-lists-of-n-size-in-Java-8/
источник
Вам нужно знать размер куска, на который вы делите свой список. Скажем, у вас есть список,
108 entries
и вам нужен размер куска25
. Таким образом, вы получите5 lists
:25 entries
каждым;8 elements
.Код:
источник