编写TreeMap自定义排序的插曲
上周有个需求,内容是将从数据库中查出的数据进行排序,作为导出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>() {@Overridepublic 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>() {@Overridepublic 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就没问题了),一定要考虑周全,在满足自定义的逻辑时也要不影响其他的逻辑,不然就会耽误交付时间。