编写TreeMap自定义排序的插曲

发布于:2025-08-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

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