问题:集合中用四个字符串#DEF #ABC ABC ABC#,排序后得到ABC ABC# #ABC #DEF
分析:一个集合中使用了两种排序,ABC ABC#属于标准的字典顺序排序,而要把#开头的字符串放到非#开头的后面,相当于使用了降序排序。(#的unicode编码为35,远远小于字母的unicode编码)
解决:写比较器的时候对字符串进行分析,如果遇到#开头的字符串,将#加128后再进行排序比较。
代码:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("#ABC");
list.add("#DEF");
list.add("ABC");
list.add("ABC#");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
if(arg0.charAt(0)=='#' ^ arg1.charAt(0)=='#'){
if(arg0.charAt(0)=='#') {
arg0 = new StringBuilder(arg0).replace(0, 1, String.valueOf((char)('#'+128))).toString();
System.out.println("arg0:"+arg0);
return arg0.compareTo(arg1);
} else {
arg1 = new StringBuilder(arg1).replace(0, 1, String.valueOf((char)('#'+128))).toString();
System.out.println("arg1:"+arg1);
return arg0.compareTo(arg1);
}
}else{
return arg0.compareTo(arg1);
}
}
});
System.out.println(list.toString());
}