This commit is contained in:
Looly 2022-07-16 12:18:21 +08:00
parent 22366f38f1
commit ab79193c7e
2 changed files with 17 additions and 11 deletions

View File

@ -1,5 +1,7 @@
package cn.hutool.core.collection; package cn.hutool.core.collection;
import cn.hutool.core.lang.Assert;
import java.util.AbstractList; import java.util.AbstractList;
import java.util.List; import java.util.List;
@ -21,19 +23,18 @@ public class Partition<T> extends AbstractList<List<T>> {
/** /**
* 列表分区 * 列表分区
* *
* @param list 被分区的列表 * @param list 被分区的列表非空
* @param size 每个分区的长度 * @param size 每个分区的长度必须>0
*/ */
public Partition(List<T> list, int size) { public Partition(List<T> list, int size) {
this.list = list; this.list = Assert.notNull(list);
this.size = size; this.size = Math.min(list.size(), size);
} }
@Override @Override
public List<T> get(int index) { public List<T> get(int index) {
int listSize = list.size(); final int start = index * size;
int start = Math.min(index * size, listSize); final int end = Math.min(start + size, list.size());
int end = Math.min(start + size, listSize);
return list.subList(start, end); return list.subList(start, end);
} }
@ -42,8 +43,9 @@ public class Partition<T> extends AbstractList<List<T>> {
// 此处采用动态计算以应对list变 // 此处采用动态计算以应对list变
final int size = this.size; final int size = this.size;
final int total = list.size(); final int total = list.size();
int length = (total + size - 1) / size; // 类似于判断余数当总数非整份size时多余的数>=1则相当于被除数多一个size做到+1目的
return length; // 类似于if(total % size > 0){length += 1;}
return (total + size - 1) / size;
} }
@Override @Override

View File

@ -73,12 +73,16 @@ public class ListUtilTest {
lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3, 4), 4); lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3, 4), 4);
Assert.assertEquals("[[1], [2], [3], [4]]", lists.toString()); Assert.assertEquals("[[1], [2], [3], [4]]", lists.toString());
lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3), 5);
Assert.assertEquals("[[1], [2], [3], [], []]", lists.toString());
lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3), 2); lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3), 2);
Assert.assertEquals("[[1, 2], [3]]", lists.toString()); Assert.assertEquals("[[1, 2], [3]]", lists.toString());
} }
@Test
public void splitAvgTest2() {
List<List<Object>> lists = ListUtil.splitAvg(Arrays.asList(1, 2, 3), 5);
Assert.assertEquals("[[1], [2], [3], [], []]", lists.toString());
}
@Test(expected = IllegalArgumentException.class) @Test(expected = IllegalArgumentException.class)
public void splitAvgNotZero() { public void splitAvgNotZero() {
// limit不能小于等于0 // limit不能小于等于0