- 算法源码
public static<t> List<t> getSubList(ArrayList<t> arr,int index,int size){
//分多少次处理
//注意,返回的是int类型,意味着例如:10/3 = 3.xxxx = 3 哦! 向下floor到整数
int requestCount = arr.size() / size;
//避免null指针问题,如果越界返回空ArrayList对象
//ArrayList实现了List接口
if(index < 0 || index > requestCount)
return new ArrayList<t>();
//计算出当前页的第一个item的索引号
int from = index * size;
//这是为了解决截断问题
int to = Math.min(arr.size(), (index + 1) * size);
//从源arr中,根据offset和length返回子列表
List<t> subList = arr.subList(from, to);
return subList;
}
- 创建测试用函数:
public static ArrayList<Integer> makeArrayList(int num){
ArrayList<Integer> arr = new ArrayList<>(num);
for(int i = 0; i < num; i++){
arr.add(i);
}
return arr;
}
- 测试:
public static void main(String[] args) throws IOException {
ArrayList<Integer> list = makeArrayList(17);
List<Integer> subList = null;
//注意:这里循环10次哦,每次取7个生成一个子表返回,理论上可以处理最多70个数据
//但是实际ArrayList中只有17个数据,目的是测试越界以及null问题
for(int i = 0; i < 10; i++){
subList = getSubList(list,i,7);
System.out.println(subList.toString());
}
}
- 结果:
[0, 1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12, 13]
[14, 15, 16]
[]
[]
[]
[]
[]
[]
[]
- java的不足之处:
容器中只能存放引用类型,导致发生大量的装箱拆箱行为