Java:将列表拆分为两个子列表?

2022-09-01 05:34:05

在Java中将列表拆分为两个子列表的最简单,最标准和/或最有效的方法是什么?可以改变原始列表,因此不需要复制。方法签名可以是

/** Split a list into two sublists. The original list will be modified to
 * have size i and will contain exactly the same elements at indices 0 
 * through i-1 as it had originally; the returned list will have size 
 * len-i (where len is the size of the original list before the call) 
 * and will have the same elements at indices 0 through len-(i+1) as 
 * the original list had at indices i through len-1.
 */
<T> List<T> split(List<T> list, int i);

[EDIT] 返回原始列表上的视图,如果修改原始列表,该视图将变为无效。因此,除非它也省略了原始引用(或者,如Marc Novakowski的答案,使用但立即复制结果),否则不能使用。List.subListsplitsubListsubList


答案 1

快速半伪代码:

List sub=one.subList(...);
List two=new XxxList(sub);
sub.clear(); // since sub is backed by one, this removes all sub-list items from one

它使用标准的List实现方法,并避免了所有循环。clear() 方法也将对大多数列表使用内部,并且效率更高。removeRange()


答案 2

您可以使用常用的实用程序,例如番石榴库:

import com.google.common.collect.Lists;
import com.google.common.math.IntMath;
import java.math.RoundingMode;

int partitionSize = IntMath.divide(list.size(), 2, RoundingMode.UP);
List<List<T>> partitions = Lists.partition(list, partitionSize);

结果是两个列表的列表 - 不完全符合您的规格,但如果需要,您可以轻松调整。