Discuss / Java / 关于 “上面的UserComparator的比较逻辑其实还是有问题的,它会把A10排在A2的前面,请尝试修复该错误。”

关于 “上面的UserComparator的比较逻辑其实还是有问题的,它会把A10排在A2的前面,请尝试修复该错误。”

Topic source

CXM

#1 Created at ... [Delete] [Delete and Lock User]

先说原因:因为String的compareTo方法,采用的是先将两个要比较的字符串转换为byte数组,再计算两个byte数组的长度,然后进行for循环比较,上限则为byte数组长度较短的值,如果两个数组相同索引位置的值不同,则对两个值做差,从而得出这两个字符串谁在前谁在后。所以,

"A10"

CXM

#2 Created at ... [Delete] [Delete and Lock User]

莫名其妙的内容少了一部分,重新传一下

先说原因:因为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

Reply