package com.xx.utils;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ListUtils {
/**
* @Title: averageAssign
* @Description: 将一个list均分成n个list,主要通过偏移量来实现的
* @param @param source
* @param @param n
* @param @return
* @return List<List<T>>
* @throws
*/
public static <T> List<List<T>> averageAssign(List<T> source,int n){
List<List<T>> result=new ArrayList<List<T>>();
int remaider=source.size()%n; //(先计算出余数)
int number=source.size()/n; //然后是商
int offset=0;//偏移量
for(int i=0;i<n;i++){
List<T> value=null;
if(remaider>0){
value=source.subList(i*number+offset, (i+1)*number+offset+1);
remaider--;
offset++;
}else{
value=source.subList(i*number+offset, (i+1)*number+offset);
}
result.add(value);
}
return result;
}
/**
* @Title: splitList
* @Description: 将一个list切分成多个长度为groupSize的list
* @param @param list
* @param @param groupSize
* @param @return
* @return List<List<T>>
* @throws
*/
public static <T> List<List<T>> splitList(List<T> list , int groupSize){
int length = list.size();
// 计算可以分成多少组
int num = ( length + groupSize - 1 )/groupSize ;
// TODO
List<List<T>> newList = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
// 开始位置
int fromIndex = i * groupSize;
// 结束位置
int toIndex = (i+1) * groupSize < length ? ( i+1 ) * groupSize : length ;
newList.add(list.subList(fromIndex,toIndex)) ;
}
return newList ;
}
/**
* 根据list中元素的指定属性进行分组,转为map
* @param list
* @param groupFieldName 分组的属性名
* @param <T>
* @return
* @throws Exception
*/
public static <T> Map<String, List<T>> groupToMap(List<T> list, String groupFieldName) throws Exception {
Map<String, List<T>> map = new HashMap<>();
for (T t : list) {
Field groupField = t.getClass().getDeclaredField(groupFieldName);
//将该属性设置为可访问
groupField.setAccessible(true);
Object fieldValue = groupField.get(t);
String key = fieldValue.toString();
List<T> existKeyList = map.get(key);
if (null == existKeyList) {
existKeyList = new ArrayList<>();
map.put(key, existKeyList);
}
existKeyList.add(t);
}
return map;
}
/**
* 开始分页
* @param list
* @param pageNum 页码
* @param pageSize 每页多少条数据
* @return
*/
public static <T> List<T> startPage(List<T> list, Integer pageNum, Integer pageSize) {
if (list == null) {
return null;
}
if (list.size() == 0) {
return null;
}
if (pageNum == null || pageSize == null) {
return null;
}
Integer count = list.size(); // 记录总数
Integer pageCount; // 页数
if (count % pageSize == 0) {
pageCount = count / pageSize;
} else {
pageCount = count / pageSize + 1;
}
int fromIndex = 0; // 开始索引
int toIndex = 0; // 结束索引
if (!pageNum.equals(pageCount)) {
fromIndex = (pageNum - 1) * pageSize;
toIndex = fromIndex + pageSize;
} else {
fromIndex = (pageNum - 1) * pageSize;
toIndex = count;
}
List<T> pageList = list.subList(fromIndex, toIndex);
return pageList;
}
@SuppressWarnings("unused")
public static void main(String[] args) {
List<Integer> integers=new ArrayList<>();
integers.add(1);
integers.add(2);
integers.add(3);
integers.add(4);
integers.add(5);
List<List<Integer>> lists=averageAssign(integers, 2);
System.out.println(lists);//[[1, 2, 3], [4, 5]]
List<List<Integer>> lists2=splitList(integers, 2);
System.out.println(lists2);//[[1, 2], [3, 4], [5]]
}
}
ListUtils
最新推荐文章于 2024-08-23 22:21:10 发布