Java將一個大的List
依指定大小分割成多個小的子List
的方法如下。
使用Guava函式庫的Lists.partition(List<T> list, int size)
。
<!-- 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的方法,因為效能比較好。
參考:
沒有留言:
張貼留言