網頁

2019/6/19

Java 將List分割為多個子List
split List to multiple sub Lists

Java將一個大的List依指定大小分割成多個小的子List的方法如下。

使用Guava函式庫的Lists.partition(List<T> list, int size)

Guava Maven dependency

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.0-jre</version>
</dependency>
List<Integer> list = new ArrayList<>(Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3));
int size = 3;
List<List<Integer>> subLists = Lists.partition(new ArrayList<>(list), size); // 第一個參數是要被分割的list,第二個參數是要分割的大小。
subLists.forEach(System.out::println);
/* 印出結果
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
*/

或是用Apache Commons Collections函式庫的ListUtils.partition(List<T> list, int size)

Apache Commons Collections Maven dependency

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.3</version>
</dependency>

用法同Guava的Lists.partition(List<T> list, int size)

List<Integer> list = new ArrayList<>(Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3));
int size = 3;
List<List<Integer>> subLists = ListUtils.partition(new ArrayList<>(list), 3); // 第一個參數是要被分割的list,第二個參數是要分割的大小。
subLists.forEach(System.out::println);
/* 印出結果
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
*/

使用Java 8 Stream搭配Collectors.groupingBy()

List<Integer> list = new ArrayList<>(Arrays.asList(1, 1, 1, 2, 2, 2, 3, 3, 3));
int size = 3;
final AtomicInteger counter = new AtomicInteger();

List<List<Integer>> subLists = 
        new ArrayList<>(
                list.stream().collect(
                        Collectors.groupingBy((e) -> { 
                            int key = counter.getAndIncrement() / size;
                            return key;
                        })).values());

subLists.forEach(System.out::println);
/* 印出結果
[1, 1, 1]
[2, 2, 2]
[3, 3, 3]
*/

建議使用Guava或Apache Commons Collections的方法,因為效能比較好。


參考:

沒有留言:

張貼留言