Java分割集合 Java分割 list java分割集合 java分割list Java 平均分割集合列表
需求,生产二维码内容有限制,并且 内容过多,会导致二维码很臃肿 扫描不出来,之前是用 谷歌的 Lists.partition
,但是还有一个问题就是,分割好的集合数量不均匀,比如 300个文字,一个集合最多存放200个字,就会出现 一个集合 有200个,一个集合只有100个,这种,我想要的是 两个集合 都是平均数量 只有 150个
纯Java jdk实现
分割方法
public class MyListUitls{
/**
* 按照指定数量分割集合
*
* @param list 需要分割的集合
* @param size 一个集合最多数量
* @return List<List < T>>
*/
public static <T> List<List<T>> partition(List<T> list, int size) {
// 一个集合最多数量
BigDecimal singleListCount = new BigDecimal(size);
// 当前集合总数量
BigDecimal nowAllCount = new BigDecimal(list.size());
// 分割集合数量 = 总数量 / 当个集合最多数量, 值始终要五入,例如 当个集合最多100,总数量是120个,那么需要两个集合
int listCount = nowAllCount.divide(singleListCount, 0, RoundingMode.UP).intValue();
// 创建 分割集合
List<List<T>> partitionList = new LinkedList<>();
for (int i = 0; i < listCount; i++) {
partitionList.add(new LinkedList<>());
}
// 计算 一个集合平均数量,避免出现 两个集合,一个集合有150个,另外一个集合只有1个的现象
int avg = list.size() / listCount;
// 将数据平均放入 分割好的集合中
for (T s : list) {
// 遍历放入分割好的集合
for (int i = 0; i < listCount; i++) {
if (partitionList.get(i).size() < avg) {
partitionList.get(i).add(s);
break;
}
}
}
return partitionList;
}
}
调用方法Demo测试
/**
* 平均分割集合数量
*/
@Test
public void test1() {
LinkedList<String> childSnList = new LinkedList<>();
for (int i = 1, size = 1500; i <= size; i++) {
childSnList.add(String.valueOf(i));
}
List<List<String>> partitionList = MyListUitls.partition(childSnList, 150);
System.out.printf("分割后的集合数量:%s\n", partitionList.size());
partitionList.forEach(item -> {
item.forEach(System.out::println);
});
}
源码分割Demo测试
/**
* 平均分割集合数量
*/
@Test
public void Test2() {
// 准备一个 集合源数据,存放170个字符串,一个集合存放150个,那么分割后应该有两个集合
LinkedList<String> childSnList = new LinkedList<>();
for (int i = 1, size = 170; i <= size; i++) {
childSnList.add(String.valueOf(i));
}
// 一个集合最多数量
BigDecimal singleListCount = new BigDecimal(150);
// 当前集合总数量
BigDecimal nowAllCount = new BigDecimal(childSnList.size());
// 分割集合数量 = 总数量 / 当个集合最多号数量, 值始终要五入,例如 当个集合最多100,总数量是120个,那么需要两个集合
int listCount = nowAllCount.divide(singleListCount, 0, RoundingMode.UP).intValue();
// 创建 分割集合
List<List<String>> partitionList = new LinkedList<>();
for (int i = 0; i < listCount; i++) {
partitionList.add(new LinkedList<>());
}
// 计算 一个集合平均数量,避免出现 两个集合,一个集合有150个,另外一个集合只有1个的现象
int avg = childSnList.size() / listCount;
// 将字符串平均放入 分割好的集合中
for (String s : childSnList) {
// 遍历放入分割好的集合
for (int i = 0; i < listCount; i++) {
if (partitionList.get(i).size() < avg) {
partitionList.get(i).add(String);
break;
}
}
}
System.out.printf("分割后的集合数量:%s\n", partitionList.size());
System.out.println("开始输出字符串",
for (List<String> strings : partitionList) {
for (String string : strings) {
System.out.println(string);
}
}
}