前段时间做动态导出Excel(导出字段可选),要对导出的字段进行排序,由于要先去pgsql进行查询,然后映射成表名和条件再去mongodb再查询,这样会出现一个问题:在pgql查询的时候是有序的,但是在去mongodb查询的时候完毕,结果就没有顺序了,但是,最终导出要按字段排序,怎么办呢?后来自己写了工具类进行实现。
注意事项:要用LinkedHashMap
import org.apache.commons.lang.StringUtils;
import java.util.*;
public class ListUtils {
public static void mergeListByStringValue(List list, String condKey,String... mergeKey){
if(isNotEmpty(list)){
for (int i = 0; i < list.size()-1; i++) {
Map temp = (Map) list.get(i);
for (int j = i+1; j < list.size(); j++) {
if(temp.get(condKey)!=null && temp.get(condKey).equals(((Map)list.get(j)).get(condKey))){
mergerMap(temp,(Map)list.get(j),mergeKey);
list.remove(j);
j--;
}
}
}
}
}
public static void mergerMap(Map map1, Map map2, String... mergeKey) {
for (int i = 0; i < mergeKey.length; i++) {
int count1 = map1.get(mergeKey[i]) == null ? 0 : (int)map1.get(mergeKey[i]);
int count2 = map2.get(mergeKey[i]) == null ? 0 : (int)map2.get(mergeKey[i]);
map1.put(mergeKey[i],count1 + count2);
}
}
public static void mergeListWhenIsNull(List list, String condKey,
String condValue,String... mergeKey){
if(isNotEmpty(list)){
boolean flag = false;
Map temp = new HashMap();
temp.put(condKey,condValue);
for (int i = 0; i < list.size(); i++) {
Map map = (Map) list.get(i);
if(condValue.equals(map.get(condKey))
|| StringUtils.isBlank((String) map.get(condKey))){
mergerMap(temp,map,mergeKey);
list.remove(i);
i--;
flag = true;
}
}
if(flag){
list.add(temp);
}
mergeListByStringValue(list,condKey,mergeKey);
}
}
public static void sortByKey(List list,final String sortKey){
if(isNotEmpty(list)){
Collections.sort(list, new Comparator() {
@Override
public int compare(Map map1, Map map2) {
return Integer.parseInt(String.valueOf(map2.get(sortKey)))
- Integer.parseInt(String.valueOf(map1.get(sortKey)));//倒序排列
}
});
}
}
public static void sortByObjectKey(List list,final String sortKey, final String orderType){
if(isNotEmpty(list)){
Collections.sort(list, new Comparator() {
@Override
public int compare(Map map1, Map map2) {
if("desc".equalsIgnoreCase(orderType)){
return String.valueOf(map2.get(sortKey)).compareTo(String.valueOf(map1.get(sortKey)));//倒序排列
}else {
return String.valueOf(map1.get(sortKey)).compareTo(String.valueOf(map2.get(sortKey)));//升序排列
}
}
});
}
}
public static void mergeTwoListByKey(List list1,List list2,
String condKey,String condValue,String... mergeKey){
mergeListWhenIsNull(list1,condKey,condValue,mergeKey);
mergeListWhenIsNull(list2,condKey,condValue,mergeKey);
if(isNotEmpty(list1) && isNotEmpty(list2)){
for (int i = 0; i < list1.size(); i++) {
Map map1 = (Map) list1.get(i);
for (int j = 0; j < list2.size(); j++) {
Map map2 = (Map) list2.get(j);
if(map1.get(condKey) != null && String.valueOf(map1.get(condKey)).equals(map2.get(condKey))){
mergerMap(map1,map2,mergeKey);
list2.remove(j);
break;
}
}
}
if(isNotEmpty(list2)){
list1.addAll(list2);
}
}
}
public static boolean isEmpty(List list){
return list == null || list.isEmpty();
}
public static boolean isNotEmpty(List list){
return list != null && !list.isEmpty();
}
public static void putIfNotContains(List list,Object o){
if(!list.contains(o) && o != null && !"".equals(o)){
list.add(o);
}
}
public static Map mergeField(Listlist,String key1,String key2){
Map result = new HashMap();
if(isNotEmpty(list)){
for (int i = 0; i < list.size(); i++) {
Map temp = list.get(i);
result.put(temp.get(key1),temp.get(key2));
}
}
return result;
}
public static List getSubList(List list,int start,int limit){
if(isEmpty(list)){
return null;
}
if(start >= list.size()){
return null;
}
int end = start + limit;
if(end >= list.size()){
end = list.size();
}
return list.subList(start,end);
}
public static List addAllDistinctArrayData(String[] arr1, String[] arr2) {
List list = new ArrayList<>();
if(arr1 != null){
for (int i = 0; i < arr1.length; i++) {
putIfNotContains(list,arr1[i]);
}
}
if(arr2 != null){
for (int i = 0; i < arr2.length; i++) {
putIfNotContains(list,arr2[i]);
}
}
return list;
}
public static Listdistinct(ListusedRulesetList, String key) {
if(isEmpty(usedRulesetList)){
return usedRulesetList;
}
ListkeyList = new ArrayList<>();
for (int i = 0; i < usedRulesetList.size(); i++) {
Map map = usedRulesetList.get(i);
if(keyList.contains(map.get(key))){
usedRulesetList.remove(i);
i--;
}else {
keyList.add(map.get(key));
}
}
return usedRulesetList;
}
public static void addListIfNotExists(List list, Object o){
if(list!=null && !list.contains(o)){
list.add(o);
}
}
}
2.在封装的时候调用
//list转换成map
private Map<String, List<String>> result(List<Map> list) {
//这里必须用LinkedHashMap
Map<String, List<String>> streamCond = new LinkedHashMap<>();
for (Map<String, Object> map : list) {
String app_id = TypeUtils.castToString(map.get("app_id"));
String scenario_name = (String) map.get("scenario_name");
String collName = app_id + "_" + scenario_name;
if (streamCond.get(collName) == null) {
List<String> eventIds = new ArrayList<>();
eventIds.add((String) map.get("event_id"));
streamCond.put(collName, eventIds);
} else {
List<String> eventIds = streamCond.get(collName);
eventIds.add((String) map.get("event_id"));
}
}
return streamCond;
}
private List<Map> addCulomn(Map<String, Map> pgMap, List<Map> resultSet) {
if (ListUtils.isEmpty(resultSet)) {
return resultSet;
}
String[] codeConvert = new String[]{"certificate_type",};
String[] parentCodes = new String[]{"certificate_type",};
for (Map<String, Object> map : resultSet) {
String key = (String) map.get("_id");
for (int i = 0; i < codeConvert.length; i++) {
// logger.info("转码开始,key:{},parentCode:{},value:{}", codeConvert[i], parentCodes[i], map.get(codeConvert[i])+""); map.put(codeConvert[i], dictionaryDAOImpl.findDicDesc(parentCodes[i], map.get(codeConvert[i])+""));
}
map.put("description", pgMap.get(key).get("description"));
map.put("case_findings", pgMap.get(key).get("case_findings"));
//根据时间排序:occur_time
ListUtils.sortByObjectKey(resultSet, "occur_time", "desc");
}
return resultSet;
}