mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add Partition
This commit is contained in:
parent
ca927176d1
commit
8c1fced281
@ -10,6 +10,7 @@
|
|||||||
* 【core 】 ListUtil增加page方法重载(pr#1761@Github)
|
* 【core 】 ListUtil增加page方法重载(pr#1761@Github)
|
||||||
* 【crypto 】 增加ASN1Util
|
* 【crypto 】 增加ASN1Util
|
||||||
* 【core 】 CsvConfig改为泛型形式
|
* 【core 】 CsvConfig改为泛型形式
|
||||||
|
* 【core 】 增加Partition
|
||||||
|
|
||||||
### 🐞Bug修复
|
### 🐞Bug修复
|
||||||
|
|
||||||
|
@ -828,7 +828,7 @@ public class BeanUtil {
|
|||||||
*
|
*
|
||||||
* @param bean Bean对象
|
* @param bean Bean对象
|
||||||
* @param ignoreFiledNames 忽略检查的字段名
|
* @param ignoreFiledNames 忽略检查的字段名
|
||||||
* @return 是否为空,{@code true} - 空 / {@code false} - 非空
|
* @return 是否为非空,{@code true} - 非空 / {@code false} - 空
|
||||||
* @since 5.0.7
|
* @since 5.0.7
|
||||||
*/
|
*/
|
||||||
public static boolean isNotEmpty(Object bean, String... ignoreFiledNames) {
|
public static boolean isNotEmpty(Object bean, String... ignoreFiledNames) {
|
||||||
|
@ -1028,20 +1028,21 @@ public class CollUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 截取集合的部分
|
* 截取列表的部分
|
||||||
*
|
*
|
||||||
* @param <T> 集合元素类型
|
* @param <T> 集合元素类型
|
||||||
* @param list 被截取的数组
|
* @param list 被截取的数组
|
||||||
* @param start 开始位置(包含)
|
* @param start 开始位置(包含)
|
||||||
* @param end 结束位置(不包含)
|
* @param end 结束位置(不包含)
|
||||||
* @return 截取后的数组,当开始位置超过最大时,返回空的List
|
* @return 截取后的数组,当开始位置超过最大时,返回空的List
|
||||||
|
* @see ListUtil#sub(List, int, int)
|
||||||
*/
|
*/
|
||||||
public static <T> List<T> sub(List<T> list, int start, int end) {
|
public static <T> List<T> sub(List<T> list, int start, int end) {
|
||||||
return ListUtil.sub(list, start, end);
|
return ListUtil.sub(list, start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 截取集合的部分
|
* 截取列表的部分
|
||||||
*
|
*
|
||||||
* @param <T> 集合元素类型
|
* @param <T> 集合元素类型
|
||||||
* @param list 被截取的数组
|
* @param list 被截取的数组
|
||||||
@ -1050,6 +1051,7 @@ public class CollUtil {
|
|||||||
* @param step 步进
|
* @param step 步进
|
||||||
* @return 截取后的数组,当开始位置超过最大时,返回空的List
|
* @return 截取后的数组,当开始位置超过最大时,返回空的List
|
||||||
* @since 4.0.6
|
* @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) {
|
public static <T> List<T> sub(List<T> list, int start, int end, int step) {
|
||||||
return ListUtil.sub(list, start, end, step);
|
return ListUtil.sub(list, start, end, step);
|
||||||
@ -1072,19 +1074,20 @@ public class CollUtil {
|
|||||||
* 截取集合的部分
|
* 截取集合的部分
|
||||||
*
|
*
|
||||||
* @param <T> 集合元素类型
|
* @param <T> 集合元素类型
|
||||||
* @param list 被截取的数组
|
* @param collection 被截取的数组
|
||||||
* @param start 开始位置(包含)
|
* @param start 开始位置(包含)
|
||||||
* @param end 结束位置(不包含)
|
* @param end 结束位置(不包含)
|
||||||
* @param step 步进
|
* @param step 步进
|
||||||
* @return 截取后的数组,当开始位置超过最大时,返回空集合
|
* @return 截取后的数组,当开始位置超过最大时,返回空集合
|
||||||
* @since 4.0.6
|
* @since 4.0.6
|
||||||
*/
|
*/
|
||||||
public static <T> List<T> sub(Collection<T> list, int start, int end, int step) {
|
public static <T> List<T> sub(Collection<T> collection, int start, int end, int step) {
|
||||||
if (list == null || list.isEmpty()) {
|
if (isEmpty(collection)) {
|
||||||
return ListUtil.empty();
|
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 每个段的长度
|
* @param size 每个段的长度
|
||||||
* @return 分段列表
|
* @return 分段列表
|
||||||
* @since 5.4.5
|
* @since 5.4.5
|
||||||
|
* @deprecated 请使用 {@link ListUtil#partition(List, int)}
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public static <T> List<List<T>> splitList(List<T> list, int size) {
|
public static <T> List<List<T>> splitList(List<T> list, int size) {
|
||||||
return ListUtil.split(list, size);
|
return ListUtil.partition(list, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,7 +2,6 @@ package cn.hutool.core.collection;
|
|||||||
|
|
||||||
import cn.hutool.core.comparator.PinyinComparator;
|
import cn.hutool.core.comparator.PinyinComparator;
|
||||||
import cn.hutool.core.comparator.PropertyComparator;
|
import cn.hutool.core.comparator.PropertyComparator;
|
||||||
import cn.hutool.core.lang.Console;
|
|
||||||
import cn.hutool.core.lang.Matcher;
|
import cn.hutool.core.lang.Matcher;
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
@ -16,6 +15,7 @@ import java.util.Enumeration;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.RandomAccess;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
@ -521,7 +521,8 @@ public class ListUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 对集合按照指定长度分段,每一个段为单独的集合,返回这个集合的列表
|
* 通过传入分区长度,将指定列表分区为不同的块,每块区域的长度相同(最后一块可能小于长度)<br>
|
||||||
|
* 分区是在原List的基础上进行的,返回的分区是不可变的抽象列表,原列表元素变更,分区中元素也会变更。
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* 需要特别注意的是,此方法调用{@link List#subList(int, int)}切分List,
|
* 需要特别注意的是,此方法调用{@link List#subList(int, int)}切分List,
|
||||||
@ -534,20 +535,32 @@ public class ListUtil {
|
|||||||
* @return 分段列表
|
* @return 分段列表
|
||||||
* @since 5.4.5
|
* @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)) {
|
if (CollUtil.isEmpty(list)) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
final int listSize = list.size();
|
return (list instanceof RandomAccess)
|
||||||
final List<List<T>> result = new ArrayList<>(listSize / size + 1);
|
? new RandomAccessPartition<>(list, size)
|
||||||
int offset = 0;
|
: new Partition<>(list, size);
|
||||||
for (int toIdx = size; toIdx <= listSize; offset = toIdx, toIdx += size) {
|
|
||||||
result.add(list.subList(offset, toIdx));
|
|
||||||
}
|
}
|
||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user