Java Comparator排序不同

时间:2017-03-30 05:33:46

标签: java string comparator

public class StringComparatorTest {

public static void main(String[] args) {
    String[] a = {"abc9", "abc", "abc123", "ab9"};
    String[] b = {"abc9", "abc", "abc123", "ab9"};
    String[] c = {"abc9", "abc", "abc123", "ab9"};

    System.out.print("a_Origin     : ");
    printArray(a);
    System.out.print("c_Origin     : ");
    printArray(c);

    System.out.print("a_Default    : ");
    Arrays.sort(a);
    printArray(a);

    System.out.print("c_Default    : ");
    Arrays.sort(c);
    printArray(c);

    System.out.print("a_Customized1: ");
    Arrays.sort(a, new StringComparator());
    printArray(a);

    System.out.print("b_Customized1: ");
    Arrays.sort(b, new StringComparator());
    printArray(b);

    System.out.print("c_Customized2: ");
    Arrays.sort(c, new StringComparator2());
    printArray(c);
}

public static void printArray(String[] arr){
    for (String str: arr) {
        System.out.print(str + " ");
    }
    System.out.println();
}

}

public class StringComparator实现Comparator {

@Override
public int compare(String s1, String s2) {
    if(s1.length() == s2.length()){
        if(s1.equals(s2))
            return 0;
        else{
            for(int i = 0; i < s1.length(); i++){
                if(s1.charAt(i) > s2.charAt(i)){
                    return 1;
                }else {
                    return -1;
                }
            }
            return 0;
        }
    }else if(s1.length() < s2.length()){
        return -1;
    }else{
        return 1;
    }
}

}

public class StringComparator2实现Comparator {

@Override
public int compare(String s1, String s2) {
    if (s1.length() == s2.length()) {
        for (int i = 0; i < s1.length(); i++) {
            if (s1.charAt(i) > s2.charAt(i)) {
                return 1;
            } else if (s1.charAt(i) < s2.charAt(i)) {
                return -1;
            }
        }
        return 0;
    } else if (s1.length() < s2.length()) {
        return -1;
    } else {
        return 1;
    }
}

}

我必须使用比较器来对String对象进行排序,事实证明“StringComparator”有一些错误,但我无法弄清楚。

“StringComparator”工作正常 “Arrays.sort(b,new StringComparator());” 出货订单符合预期。

但是当我使用默认排序(下面的步骤)然后按“StringComparator”排序时,错误显示:

“Arrays.sort(a);  Arrays.sort(a,new StringComparator());“

输出订单不同,应该是相同的。 (数组a和b相同)

有人可以解释一下吗? 非常感谢〜

1 个答案:

答案 0 :(得分:0)

这可行 - 在StringComparator类中进行比较 -

public int compare(String s1, String s2) {
        if(s1.length() == s2.length()){
            if(s1.equals(s2))
                return 0;
            else{
                for(int i = 0; i < s1.length(); i++){
                    if(s1.charAt(i) != s2.charAt(i)) {
                        return s1.charAt(i) - s2.charAt(i);
                    }
                }
            }
        }
        return s1.length() - s2.length();
    }

对于首先使用默认排序排序然后自定义比较器(a_customized)排序的数组的结果与使用自定义比较器(b_customized)的on相同

旧代码中的问题似乎就在这里 -

 if(s1.charAt(i) > s2.charAt(i)){
    return 1;
 }else {
    return -1;
 }

如果s1.charAt(i)== s2.charAt(i)那么它也返回-1;