Java SortMap比较器的数字键在字母键之后排序

问题描述 投票:3回答:4

我需要一个SortedMap,其中的Charachter键是按以下方式排序的:('A'..'Z'..'0'..'9'),因此字符首先是数字,然后是数字,都以升序排列。到目前为止,这是我尝试过的操作,但是输出显示它未能返回我想要的排序,因为数字键的值仍在字母键的值之前。我究竟做错了什么?有没有更好的方法可以做到这一点?预先感谢!

public static void main(String[] args) {
    SortedMap<Character, String> sortedMap = new TreeMap<>(new Comparator<Character>() {
        @Override
        public int compare(Character o1, Character o2) {
            if (Character.isDigit(o1) && Character.isLetter(o2)){
                return o2.compareTo(o1);
            }
            else if(Character.isLetter(o1) && Character.isDigit(o2)){
                return o1.compareTo(o2);
            }
            else{
                return o1.compareTo(o2);
            }
        }
    });

    sortedMap.put('5', "five");
    sortedMap.put('8', "nine");
    sortedMap.put('A', "ALPHA");
    sortedMap.put('G', "GOLF");
    sortedMap.put('F', "FOXTROT");
    System.out.println(sortedMap.values());
}
java comparator digits letter sortedmap
4个回答
1
投票

如果o1是数字并且o2是字母,则需要返回结果“ o1> o2”,因此在这种情况下返回1。同样,如果o1是字母,o2是数字,则需要返回结果“ o1

public int compare(Character o1, Character o2) {
   if (Character.isDigit(o1) && Character.isLetter(o2)){
      return 1;
   }
   else if(Character.isLetter(o1) && Character.isDigit(o2)){
      return -1;
   }
   else{
      return o1.compareTo(o2);
   }
}


1
投票

如果o1是字母而o2是数字,则应始终返回-1,因为您always希望字母先行。相反,您应该始终返回1。

唯一应返回o1.compareTo(o2)的情况是在末尾else中,这意味着o1o2均为字母或数字,在这种情况下,比较器应简单地遵循自然顺序。] >


0
投票

[当您希望所有字母都出现在所有数字之前,并且得到一位数字和一个字母时,您根本不应该将它们进行比较:


0
投票

我更喜欢在Map声明之外使用ternary (?:)构造来构建Comparator。我还添加了一些额外的值,这些值散布在您的值中,以增加可变性。

© www.soinside.com 2019 - 2024. All rights reserved.