【发布时间】:2014-12-25 09:13:39
【问题描述】:
我有一个数组列表。我想将其分解为固定大小的子列表。例如 -
如果我的列表大小是 100。我想在一个列表中有 30 个元素。所以基本上我想创建 4 个子列表。实现这一目标的最优化方法是什么...我在互联网上查看但大多数建议导致将数组列表分解为没有固定大小的 subsists。任何leads.pointers 高度赞赏。最好是,我希望有一个可以完成这项工作的服务/方法
【问题讨论】:
我有一个数组列表。我想将其分解为固定大小的子列表。例如 -
如果我的列表大小是 100。我想在一个列表中有 30 个元素。所以基本上我想创建 4 个子列表。实现这一目标的最优化方法是什么...我在互联网上查看但大多数建议导致将数组列表分解为没有固定大小的 subsists。任何leads.pointers 高度赞赏。最好是,我希望有一个可以完成这项工作的服务/方法
【问题讨论】:
如果您被允许使用第三方库,Guava 将其作为单一方法 Lists.partition 提供,这是一个恒定时间视图。
【讨论】:
public static <T> List<List<T>> split( List<T> alist, int len ){
List<List<T>> listOfLists = new ArrayList<>();
int hi = 0;
for( int lo = 0; lo < alist.size(); lo = hi ){
hi = lo + len;
if( hi > alist.size() ) hi = alist.size();
listOfLists.add( new ArrayList<T>( alist.subList( lo, hi ) ) );
}
return listOfLists;
}
【讨论】:
List<E> subList(int fromIndex, int toIndex); 生成子列表。<T> T[] toArray(T[] a);Arrays.asList 将为您提供一个由该数组支持的固定大小的列表。【讨论】:
我喜欢@laune 的回答,但如果您使用 Java 8,也可以使用这种 功能样式 方法来避免外部循环。
public static <T> List<List<T>> splitJava8(List<T> alist, final int len) {
return IntStream.range(0, alist.size()) // Iterate over the whole thing
.filter(i -> i % len == 0) // Filter out every 'len' number
.boxed() // Create a stream (instead of IntStream)
.map(i -> alist.subList(i, Math.min(i + len, alist.size()))) // create sublists
.collect(Collectors.toList()); // Collect the whole thing to a list of lists
}
【讨论】: