上周有个需求,内容是将从数据库中查出的数据进行排序,作为导出Excel的sheet名进行输出,分析数据发现,返回值是List<Map<String,Object>>,项目中的代码是现将List中的数据选择性放存放到TreeMap<String,String>中,使用TreeMap中的特性做到有序输出;但是原开发者没有意识到如下情况:当查询条件为A时,查询的数据是Number(4,0);当查询条件为B时,查询的数据是varchar(255)。这样就出现原来1,2,3,11的顺序输出后变成了"1","12","2","3"。
最终代码如下:
public static TreeMap<String, String> createTreeMap() {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
Integer i1 = Integer.parseInt(o1);
Integer i2 = Integer.parseInt(o2);
return i1.compareTo(i2);
} catch (Exception e) {
int length = o1.length() - o2.length();
return length !=0 ? length :o1.compareTo(o2);
}
}
};
return new TreeMap<String, String>(comparator);
}
在这次编写代码过程中,出现了一个问题,本来在catch后直接return -1,结果再取出值的时候出现了问题:
public static TreeMap<String, String> createTreeMap() {
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
try {
Integer i1 = Integer.parseInt(o1);
Integer i2 = Integer.parseInt(o2);
return i1.compareTo(i2);
} catch (Exception e) {
return -1;
}
}
};
return new TreeMap<String, String>(comparator);
}
public static void main(String[] args) {
List<Map<String,Object>> list = new ArrayList<>();
TreeMap<String, String> treeMap = createTreeMap();
treeMap.put("1a", "1");
treeMap.put("11b", "11");
treeMap.put("12c", "12");
treeMap.put("21d", "21");
treeMap.put("2e", "2");
treeMap.put("3f", "3");
treeMap.put("4g", "4");
System.out.println(treeMap);
for (String s : treeMap.keySet()) {
System.out.println(s+"&&"+ treeMap.get(s));
}
}
当时特别的郁闷,为什么打印map值的时候,看起来是正常,但是在取值的时候发现key是有值的,但是value全部都是null,超级郁闷呀!
使用AI分析后得出的结论是这样的:
所以写代码不能想当然(查询时候SQL中都已经去重,所以理所当然认为返回-1就没问题了),一定要考虑周全,在满足自定义的逻辑时也要不影响其他的逻辑,不然就会耽误交付时间。