- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
- 平常开发中我们经常会出现操作集合的情况。集合判空,集合清空,切分集合等等
- 今天我们谈谈自己封装的工具类集合类,这里不要和apache下进行比较哦。纯属个人封装,比不上开源大佬的
获取最大值
- 经常遇到此类需求,获取到集合中最大值或者说最小值。你可能说这为什么要封装,我们遍历下或者排序下获取不就行了。说的式封装,当时是为了节省时间啦。遇到此类需求无非排序或者遍历两种方式。那么我将他封装起来使用更香
public static Object getMaxObject(List list) {
Object max = 0;
for (Object o : list) {
if (o.hashCode() > max.hashCode()) {
max=o;
}
}
return max;
}
- 此种方式就是通过遍历的方式来获取最大值,比较的逻辑是借助对象的hashcode完成的。另外一种方式就是先将集合从小到大排序或者从大到小排序最后去集合边界值就也可以了。
有序添加元素
- 这里得解释下,什么叫做有序添加元素。意思就是向一个集合中添加元素后始终保持元素内部的有序性。
- 比如源集合是【1,3,5】,此时向集合中添加4,正常情况下集合内部情况是【1,3,5,4】 ; 但是经过此方法将会是【1,3,4,5】
public static Integer insertObjSeriable(List newList, Object o) {
Integer lastIndex = 0;
int newSize = newList.size();
if (newSize == 0) {
newList.add(o);
}
for (int j = newSize -1; j >=0 ; j--) {
lastIndex=j;
if (newList.get(j).hashCode() > o.hashCode()) {
if (j > 0) {
if (newList.get(j - 1).hashCode() <= o.hashCode()) {
newList.add(j, o);
break;
}
} else {
newList.add(j, o);
break;
}
} else {
newList.add(o);
break;
}
}
return lastIndex;
}
- 这里主要是通过比较来确定新元素按顺序在内部的索引位置,所以会有很多if判断。
- 还是上面的思路,这里完全可以添加结束后在进行一次排序。这种方式的代码量是最少的。
均分集合
- 一个集合可能有200条数据,此时我们需要做批量新增操作,但是每个元素的字段非常多,如果在mybatis中进行sql拼接可能会超出长度限制。这个时候我们就需要将批量进行分批操作。
- 比如将200条的集合分成两个集合来操作。
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;
}
- 很显然,这里是进行二分拆除集合的,将原来的庞大集合拆分成两个甚至多个集合进行分批操作,减轻了批量服务的压力
均分集合2
- 奇怪?这里怎么又来一个均分集合啦。是不是重复了,其实并没有,还是上面的需求。200条数据会造成超出长度限制我们拆除2条集合。但是有可能2条list分别100条也还是会出现超出长度限制。
- 假如我们知道长度是多少,换算到对象上就是一次批量最多10个对象。那么这个时候我们怎么分离呢、所以这里的均分是按照元素个数拆分的。
- 200条数据我需要拆分成10个一组的多个集合
public static <T> List<List<T>> averageSize(List<T> list, int pageSize) {
List<List<T>> listArray = new ArrayList<List<T>>();
for (int i = 0; i < list.size(); i+=pageSize) {
int toIndex = i + pageSize>list.size()?list.size():i+pageSize;
listArray.add(list.subList(i, toIndex));
}
return listArray;
}
总结
- 针对集合操作的暂时就发布这些功能吧。这些都是我平时经常使用的功能
\