使用自定义比较器(如Excel坐标顺序)订购TreeMap

时间:2015-11-12 09:32:11

标签: java excel dictionary comparator

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

在Excel中,订单类似于ABC,...,AAABAC ,. ..,BA ...但我的订单是AAAAAAAB,...,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);

1 个答案:

答案 0 :(得分:2)

首先,您希望比较字符串的长度(使用String.length()),然后按字典顺序(这正是默认使用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);
       }
    }           
};

请注意,如果您使用的是Java 8,则可以更简单地编写(此代码使用以下静态导入import static java.util.Comparator.comparingInt;):

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