Java: Comment puis-je diviser un ArrayList en plusieurs petits ArrayLists?

Comment puis-je diviser un ArrayList (taille=1000) en plusieurs ArrayLists de la même taille (=10) ?

ArrayList<Integer> results;
152
demandé sur Bo Persson 2010-05-24 11:11:51

13 réponses

Vous pouvez utiliser subList(int fromIndex, int toIndex) pour obtenir une vue d'une partie de la liste d'origine.

de L'API:

renvoie une vue de la partie de cette liste entre les fromIndex , inclusive, et toIndex , exclusive. (Si fromIndex et toIndex sont égaux, la liste retournée est vide.) La liste retournée est supportée par cette liste, donc les changements non-structurels dans la liste retournée sont reflète dans cette liste, et vice-versa. La liste retournée supporte toutes les opérations de liste optionnelles supportées par cette liste.

exemple:

    List<Integer> numbers = new ArrayList<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 vous avez besoin que ces listes hachées ne soient pas une vue, alors créez simplement un nouveau List à partir du subList . Voici un exemple de quelques-unes de ces choses ensemble:

// chops a list into non-view sublists of length L
static <T> List<List<T>> chopped(List<T> list, final int L) {
    List<List<T>> parts = new ArrayList<List<T>>();
    final int N = list.size();
    for (int i = 0; i < N; i += L) {
        parts.add(new ArrayList<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!)
272
répondu polygenelubricants 2010-05-24 07:31:42

vous pouvez ajouter la bibliothèque Guava à votre projet et utiliser les listes .méthode de partition , p.ex.

List<Integer> bigList = ...
List<List<Integer>> smallerLists = Lists.partition(bigList, 10);
169
répondu Mike Q 2017-11-22 21:00:24

Apache Commons Collections 4 a une partition méthode de la ListUtils de la classe. Voici comment cela fonctionne:

import org.apache.commons.collections4.ListUtils;
...

int targetSize = 100;
List<Integer> largeList = ...
List<List<Integer>> output = ListUtils.partition(largeList, targetSize);
46
répondu johnnieb 2017-08-22 20:00:41

la réponse fournie par polygenelubricants divise une rangée basée sur la taille donnée. Je cherchais du code qui diviserait un tableau en un nombre donné de parties. Voici la modification que j'ai faite au code:

public static <T>List<List<T>> chopIntoParts( final List<T> ls, final int iParts )
{
    final List<List<T>> lsParts = new ArrayList<List<T>>();
    final int 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( new ArrayList<T>( ls.subList( i, Math.min( iT, i + iTake ) ) ) );
    }

    return lsParts;
}

J'espère que ça aidera quelqu'un.

17
répondu Lara 2013-12-10 09:03:57

Cela fonctionne pour moi

/**
* 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 
*/
public static  <T> List<List<T>> chunkList(List<T> list, int chunkSize) {
    if (chunkSize <= 0) {
        throw new IllegalArgumentException("Invalid chunk size: " + chunkSize);
    }
    List<List<T>> chunkList = new ArrayList<>(list.size() / chunkSize);
    for (int i = 0; i < list.size(); i += chunkSize) {
        chunkList.add(list.subList(i, i + chunkSize >= list.size() ? list.size() : i + chunkSize));
    }
    return chunkList;
}

par exemple :

List<Integer> stringList = new ArrayList<>();
stringList.add(0);
stringList.add(1);
stringList.add(2);
stringList.add(3);
stringList.add(4);
stringList.add(5);
stringList.add(6);
stringList.add(7);
stringList.add(8);
stringList.add(9);

List<List<Integer>> chunkList = getChunkList1(stringList, 2);
7
répondu J.R 2018-09-04 10:23:47

je suppose que le problème que vous avez est de nommer 100 ArrayLists et les peupler. Vous pouvez créer un tableau D'ArrayLists et peupler chacun de ceux qui utilisent une boucle.

la façon la plus simple (lire stupide) de faire ceci est comme ceci:

ArrayList results = new ArrayList(1000);
    // populate results here
    for (int i = 0; i < 1000; i++) {
        results.add(i);
    }
    ArrayList[] resultGroups = new ArrayList[100];
    // initialize all your small ArrayList groups
    for (int i = 0; i < 100; i++) {
            resultGroups[i] = new ArrayList();
    }
    // put your results into those arrays
    for (int i = 0; i < 1000; i++) {
       resultGroups[i/10].add(results.get(i));
    } 
3
répondu angstrom91 2010-05-24 07:36:37

une question semblable a été discutée ici, Java: diviser une liste en deux sous-listes?

vous pouvez principalement utiliser la sous-liste. Plus de détails ici: sous-liste

renvoie une vue de la partie de cette liste entre fromIndex, inclusive, et toIndex, exclusive. (Si fromIndex et toIndex sont égaux, la liste retournée est vide.) La liste retournée est supportée par cette liste, donc les changements les listes retournées sont reflétées dans cette liste, et vice-versa. La liste retournée supporte toutes les opérations de liste optionnelles supportées par cette liste...

3
répondu Incognito 2017-05-23 11:54:59

créer une nouvelle liste et ajouter une vue sous-liste de la liste des sources en utilisant la méthode addAll pour créer une nouvelle sous-liste

Liste newList = new ArrayList(); newList.addAll (sourceList.sous-liste (startIndex, endIndex));

2
répondu user688 2016-08-26 04:16:06

Vous pouvez également utiliser FunctionalJava bibliothèque - là est partition méthode pour List . Cette lib a ses propres types de collections, vous pouvez les convertir en collections java de part et d'autre.

import fj.data.List;

java.util.List<String> javaList = Arrays.asList("a", "b", "c", "d" );

List<String> fList = Java.<String>Collection_List().f(javaList);

List<List<String> partitions = fList.partition(2);
1
répondu Mikhail Golubtsov 2015-04-28 06:44:22
import org.apache.commons.collections4.ListUtils;
ArrayList<Integer> mainList = .............;
List<List<Integer>> multipleLists = ListUtils.partition(mainList,100);
int i=1;
for (List<Integer> indexedList : multipleLists){
  System.out.println("Values in List "+i);
  for (Integer value : indexedList)
    System.out.println(value);
i++;
}
1
répondu Rahul Palakurthi 2017-07-27 09:12:36

si vous ne voulez pas importer la bibliothèque Apache, essayez ce code simple:

final static int MAX_ELEMENT = 20;

public static void main(final String[] args) {

    final List<String> list = new ArrayList<String>();

    for (int i = 1; i <= 161; i++) {
        list.add(String.valueOf(i));
        System.out.print("," + String.valueOf(i));
    }
    System.out.println("");
    System.out.println("### >>> ");
    final List<List<String>> result = splitList(list, MAX_ELEMENT);

    for (final List<String> entry : result) {
        System.out.println("------------------------");
        for (final String elm : entry) {
            System.out.println(elm);
        }
        System.out.println("------------------------");
    }

}

private static List<List<String>> splitList(final List<String> list, final int maxElement) {

    final List<List<String>> result = new ArrayList<List<String>>();

    final int div = list.size() / maxElement;

    System.out.println(div);

    for (int i = 0; i <= div; i++) {

        final int startIndex = i * maxElement;

        if (startIndex >= list.size()) {
            return result;
        }

        final int endIndex = (i + 1) * maxElement;

        if (endIndex < list.size()) {
            result.add(list.subList(startIndex, endIndex));
        } else {
            result.add(list.subList(startIndex, list.size()));
        }

    }

    return result;
}
0
répondu B.JAAFAR 2016-11-22 11:19:44

vous devez savoir la taille du morceau par lequel vous divisez votre liste. Disons que vous avez une liste de 108 entries et vous avez besoin d'une taille de bloc de 25 . Ainsi vous finirez avec 5 lists :

  • 4 ayant 25 entries chacun;
  • 1 (cinquième) ayant 8 elements .

Code:

public static void main(String[] args) {

        List<Integer> list = new ArrayList<Integer>();
        for (int i=0; i<108; i++){
            list.add(i);
        }
        int size= list.size();
        int j=0;
                List< List<Integer> > splittedList = new ArrayList<List<Integer>>()  ;
                List<Integer> tempList = new ArrayList<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 = new ArrayList<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=0
            System.out.println("Chunk number: "+(k+1)+" has elements = "+splittedList.get(k).size());
        }
    }
0
répondu yogesh kumar 2017-11-10 10:27:33

Java 8

nous pouvons diviser une liste basée sur une certaine taille ou basée sur une condition.

static Collection<List<Integer>> partitionIntegerListBasedOnSize(List<Integer> inputList, int size) {
        return inputList.stream()
                .collect(Collectors.groupingBy(s -> (s-1)/size))
                .values();
}
static <T> Collection<List<T>> partitionBasedOnSize(List<T> inputList, int size) {
        final AtomicInteger counter = new AtomicInteger(0);
        return inputList.stream()
                    .collect(Collectors.groupingBy(s -> counter.getAndIncrement()/size))
                    .values();
}
static <T> Collection<List<T>> partitionBasedOnCondition(List<T> inputList, Predicate<T> condition) {
        return inputList.stream().collect(Collectors.partitioningBy(s-> (condition.test(s)))).values();
}

alors nous pouvons les utiliser comme:

final List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
System.out.println(partitionIntegerListBasedOnSize(list, 4));  // [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
System.out.println(partitionBasedOnSize(list, 4));  // [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10]]
System.out.println(partitionBasedOnSize(list, 3));  // [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
System.out.println(partitionBasedOnCondition(list, i -> i<6));  // [[6, 7, 8, 9, 10], [1, 2, 3, 4, 5]]
0
répondu i_am_zero 2018-08-14 08:56:07