关于 “上面的UserComparator的比较逻辑其实还是有问题的,它会把A10排在A2的前面,请尝试修复该错误。”
Topic source莫名其妙的内容少了一部分,重新传一下
先说原因:因为String的compareTo方法,采用的是先将两个要比较的字符串转换为byte数组,再计算两个byte数组的长度,然后进行for循环比较,
上限则为byte数组长度较短的值,如果两个数组相同索引位置的值不同,则对两个值做差,从而得出这两个字符串谁在前谁在后。所以,"A10"转换为byte[]为
[65, 49, 48],"A2"转换为byte[]数组为[65, 50],两个数组从索引为1的位置值不同,做差为49-50=-1,从而得出"A10"要比"A2"排序要跟靠前的结果。
再说修复的方法:因为示例给出的字母都是只有一个,那就直接去掉首位的字母,并将数字部分转变为int类型的值,然后再进行比较。
最后展示比较器部分的代码:
class UserComparator implements Comparator<User> {
public int compare(User u1, User u2) {
if (u1.number.charAt(0) == u2.number.charAt(0)) {
// 如果两人的号都是A开头或者都是V开头,比较号的大小:
//return u1.number.compareTo(u2.number);
int u1Num = Integer.parseInt(u1.number.substring(1));
int u2Num = Integer.parseInt(u2.number.substring(1));
return u1Num > u2Num ? 1 : -1;
}
if (u1.number.charAt(0) == 'V') {
// u1的号码是V开头,优先级高:
return -1;
} else {
return 1;
}
}
}
- 1
CXM
先说原因:因为String的compareTo方法,采用的是先将两个要比较的字符串转换为byte数组,再计算两个byte数组的长度,然后进行for循环比较,上限则为byte数组长度较短的值,如果两个数组相同索引位置的值不同,则对两个值做差,从而得出这两个字符串谁在前谁在后。所以,