问题:
业务:根据170个煤矿编码,查询opentsdb,然后根据返回值将人员卡编码和人员表匹配出信息,再根据返回值将人员卡编码和分站信息表匹配出信息。
一开始:将一个一个的煤矿编码传入到opentsdb,然后根据返回值将人员卡编码和人员表匹配出信息,再根据返回值将人员卡编码和分站信息表匹配出信息。用时5分.
第1次优化:将煤矿编码分组(每组10个)传入到opentsdb查询返回,然后拼接成一个大的结果集,另外一边就是将所有的煤矿编码传入到人员表和分站表查询出来结果集,在根据optsdb大结果集遍历根据人员分站结果集匹配信息。由于opentsdb查询过大,时间超出。
第二次优化:将煤矿编码分组(每组10个)传入到opentsdb,人员表和分站表中进行查询,然后信息匹配,然后将这些数据进行list addll添加到新的大的结果集返回。用时1分多一点。
分组算法代码:
https://blog.csdn.net/dwz735660836/article/details/77200551 原链接。这个稍微有点BUG,如果有十个数,将其按照三个分,应该是4组,却分了3组,第1组多出一个10,十一个按照三个分,就会是四个组。所以我做了一个小优化。
public class test {
/**
* @param list 煤矿编码list
* @param n 代表每组多少煤矿编码
* @return 每组多少个煤矿编码
*/
private static List<List<String>> grouping(List<String> list, Integer n) {
// 求余数
int yushu = list.size() % n;
// 求分组数
int count0 = list.size() / n;
boolean flag = false;
if(yushu>=n/1){
flag=true;
}
List<List<String>> data = new ArrayList<>();
// 获取多余list
List<String> sub = new ArrayList<>(list.subList(list.size() - yushu , list.size()));
// 遍历list到余数前
for (int i = 0; i < count0+1; i++) {
List<String> ls ;
if(flag){
if(i==count0){
break;
}
ls = new ArrayList<>(list.subList(i * n, i * n + n));
// 将余出的数据加入分组
if (i < sub.size()) {
ls.add(sub.get(i));
}
}else{
int endex = i * n + n;
if(endex>=list.size()){
endex=list.size();
}
ls = new ArrayList<>(list.subList(i * n, endex));
}
if(ls.size()!=0){
data.add(ls);
}
}
return data;
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 5; i++) {
list.add(i + "");
}
List<List<String>> test = test(list, 3);
System.out.println("result:" + test);
}
}