订购带有自定义比较器的 TreeMap,例如 Excel 坐标顺序

Order a TreeMap with custom comparator like Excel coordinate order

我正在使用 TreeMap 及其 subMap 来管理 Excel 文件。 我使用 Excel 坐标作为键。

在 Excel 中,顺序类似于 ABC、...、AAABAC, ..., BA... 但是我的顺序是 A, AA, AAA, AB, ... , B.

我认为解决方案是使用自定义比较器,但我不知道如何使其获得 Excel 字母顺序。

Comparator<String> excelOrder= new Comparator<String>() {
    @Override public int compare(String s1, String s2) {
        //make order
    }           
};

然后使用

   SortedMap<String,String> map = new TreeMap<String,String>(secondCharComparator);

首先,您要比较字符串的长度(使用 String.length()) and then lexicographically (this is exactly what's done by default with String.compareTo(other))。以下内容正是这样做的:

Comparator<String> excelOrder = new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
       int s1Length = s1.length();
       int s2Length = s2.length();
       if (s1Length < s2Length) {
           return -1;
       } else if (s1Length > s2Length) {
           return 1;
       } else {
           return s1.compareTo(s2);
       }
    }           
};

注意,如果你使用的是Java8,这可以写得更简单(此代码使用以下静态导入import static java.util.Comparator.comparingInt;):

Comparator<String> excelOrder = comparingInt(String::length).thenComparing(String::compareTo);