add Partition

This commit is contained in:
Looly 2021-08-18 18:28:29 +08:00
parent ca927176d1
commit 8c1fced281
6 changed files with 124 additions and 25 deletions

View File

@ -10,6 +10,7 @@
* 【core 】 ListUtil增加page方法重载pr#1761@Github
* 【crypto 】 增加ASN1Util
* 【core 】 CsvConfig改为泛型形式
* 【core 】 增加Partition
### 🐞Bug修复

View File

@ -828,7 +828,7 @@ public class BeanUtil {
*
* @param bean Bean对象
* @param ignoreFiledNames 忽略检查的字段名
* @return 是否为{@code true} - / {@code false} -
* @return 是否为{@code true} - / {@code false} -
* @since 5.0.7
*/
public static boolean isNotEmpty(Object bean, String... ignoreFiledNames) {

View File

@ -1028,20 +1028,21 @@ public class CollUtil {
}
/**
* 截取集合的部分
* 截取列表的部分
*
* @param <T> 集合元素类型
* @param list 被截取的数组
* @param start 开始位置包含
* @param end 结束位置不包含
* @return 截取后的数组当开始位置超过最大时返回空的List
* @see ListUtil#sub(List, int, int)
*/
public static <T> List<T> sub(List<T> list, int start, int end) {
return ListUtil.sub(list, start, end);
}
/**
* 截取集合的部分
* 截取列表的部分
*
* @param <T> 集合元素类型
* @param list 被截取的数组
@ -1050,6 +1051,7 @@ public class CollUtil {
* @param step 步进
* @return 截取后的数组当开始位置超过最大时返回空的List
* @since 4.0.6
* @see ListUtil#sub(List, int, int, int)
*/
public static <T> List<T> sub(List<T> list, int start, int end, int step) {
return ListUtil.sub(list, start, end, step);
@ -1072,19 +1074,20 @@ public class CollUtil {
* 截取集合的部分
*
* @param <T> 集合元素类型
* @param list 被截取的数组
* @param collection 被截取的数组
* @param start 开始位置包含
* @param end 结束位置不包含
* @param step 步进
* @return 截取后的数组当开始位置超过最大时返回空集合
* @since 4.0.6
*/
public static <T> List<T> sub(Collection<T> list, int start, int end, int step) {
if (list == null || list.isEmpty()) {
public static <T> List<T> sub(Collection<T> collection, int start, int end, int step) {
if (isEmpty(collection)) {
return ListUtil.empty();
}
return sub(new ArrayList<>(list), start, end, step);
final List<T> list = collection instanceof List ? (List<T>)collection : ListUtil.toList(collection);
return sub(list, start, end, step);
}
/**
@ -1099,9 +1102,11 @@ public class CollUtil {
* @param size 每个段的长度
* @return 分段列表
* @since 5.4.5
* @deprecated 请使用 {@link ListUtil#partition(List, int)}
*/
@Deprecated
public static <T> List<List<T>> splitList(List<T> list, int size) {
return ListUtil.split(list, size);
return ListUtil.partition(list, size);
}
/**

View File

@ -2,7 +2,6 @@ package cn.hutool.core.collection;
import cn.hutool.core.comparator.PinyinComparator;
import cn.hutool.core.comparator.PropertyComparator;
import cn.hutool.core.lang.Console;
import cn.hutool.core.lang.Matcher;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
@ -16,6 +15,7 @@ import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.RandomAccess;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
@ -521,7 +521,8 @@ public class ListUtil {
}
/**
* 对集合按照指定长度分段每一个段为单独的集合返回这个集合的列表
* 通过传入分区长度将指定列表分区为不同的块每块区域的长度相同最后一块可能小于长度<br>
* 分区是在原List的基础上进行的返回的分区是不可变的抽象列表原列表元素变更分区中元素也会变更
*
* <p>
* 需要特别注意的是此方法调用{@link List#subList(int, int)}切分List
@ -534,20 +535,32 @@ public class ListUtil {
* @return 分段列表
* @since 5.4.5
*/
public static <T> List<List<T>> split(List<T> list, int size) {
public static <T> List<List<T>> partition(List<T> list, int size) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
final int listSize = list.size();
final List<List<T>> result = new ArrayList<>(listSize / size + 1);
int offset = 0;
for (int toIdx = size; toIdx <= listSize; offset = toIdx, toIdx += size) {
result.add(list.subList(offset, toIdx));
return (list instanceof RandomAccess)
? new RandomAccessPartition<>(list, size)
: new Partition<>(list, size);
}
if (offset < listSize) {
result.add(list.subList(offset, listSize));
}
return result;
/**
* 对集合按照指定长度分段每一个段为单独的集合返回这个集合的列表
*
* <p>
* 需要特别注意的是此方法调用{@link List#subList(int, int)}切分List
* 此方法返回的是原List的视图也就是说原List有变更切分后的结果也会变更
* </p>
*
* @param <T> 集合元素类型
* @param list 列表
* @param size 每个段的长度
* @return 分段列表
* @since 5.4.5
* @see #partition(List, int)
*/
public static <T> List<List<T>> split(List<T> list, int size) {
return partition(list, size);
}
}

View File

@ -0,0 +1,53 @@
package cn.hutool.core.collection;
import java.util.AbstractList;
import java.util.List;
/**
* 列表分区或分段<br>
* 通过传入分区长度将指定列表分区为不同的块每块区域的长度相同最后一块可能小于长度<br>
* 分区是在原List的基础上进行的返回的分区是不可变的抽象列表原列表元素变更分区中元素也会变更
* 参考Guava的Lists#Partition
*
* @param <T> 元素类型
* @author looly, guava
* @since 5.7.10
*/
public class Partition<T> extends AbstractList<List<T>> {
final List<T> list;
final int size;
/**
* 列表分区
*
* @param list 被分区的列表
* @param size 每个分区的长度
*/
public Partition(List<T> list, int size) {
this.list = list;
this.size = size;
}
@Override
public List<T> get(int index) {
int start = index * size;
int end = Math.min(start + size, list.size());
return list.subList(start, end);
}
@Override
public int size() {
// 此处采用动态计算以应对list变化
final int total = list.size();
int length = total / size;
if(total % length > 0){
length += 1;
}
return length;
}
@Override
public boolean isEmpty() {
return list.isEmpty();
}
}

View File

@ -0,0 +1,27 @@
package cn.hutool.core.collection;
import java.util.List;
import java.util.RandomAccess;
/**
* 列表分区或分段可随机访问列表<br>
* 通过传入分区长度将指定列表分区为不同的块每块区域的长度相同最后一块可能小于长度<br>
* 分区是在原List的基础上进行的返回的分区是不可变的抽象列表原列表元素变更分区中元素也会变更
* 参考Guava的Lists#RandomAccessPartition
*
* @param <T> 元素类型
* @author looly, guava
* @since 5.7.10
*/
public class RandomAccessPartition<T> extends Partition<T> implements RandomAccess {
/**
* 构造
*
* @param list 被分区的列表必须实现{@link RandomAccess}
* @param size 每个分区的长度
*/
public RandomAccessPartition(List<T> list, int size) {
super(list, size);
}
}