我需要一个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());
}
如果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);
}
}
如果o1
是字母而o2
是数字,则应始终返回-1,因为您always希望字母先行。相反,您应该始终返回1。
唯一应返回o1.compareTo(o2)
的情况是在末尾else
中,这意味着o1
和o2
均为字母或数字,在这种情况下,比较器应简单地遵循自然顺序。] >
[当您希望所有字母都出现在所有数字之前,并且得到一位数字和一个字母时,您根本不应该将它们进行比较:
我更喜欢在Map声明之外使用ternary (?:)
构造来构建Comparator
。我还添加了一些额外的值,这些值散布在您的值中,以增加可变性。