Java Comparator以不同的方式排序

Java Comparator以不同的方式排序,java,string,comparator,Java,String,Comparator,公共类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

公共类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();
}
}

公共类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;
    }
}
@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;
    }
}
@覆盖
公共整数比较(字符串s1、字符串s2){
如果(s1.length()==s2.length()){
如果(s1等于(s2))
返回0;
否则{
对于(int i=0;is2.字符(i)){
返回1;
}否则{
返回-1;
}
}
返回0;
}
}else if(s1.length()
}

公共类StringComparator2实现了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;
    }
}
@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;
    }
}
@覆盖
公共整数比较(字符串s1、字符串s2){
如果(s1.length()==s2.length()){
对于(int i=0;is2.字符(i)){
返回1;
}如果(s1.字符(i)
}

我必须使用比较器来对字符串对象进行排序,结果发现“StringComparator”有一些错误,但我不知道

“StringComparator”在 Arrays.sort(b,新的StringComparator()) 输出命令与预期一致

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

“数组.排序(a); Arrays.sort(一个新的StringComparator())

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

有人能解释一下吗?
非常感谢~

这项工作-在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();
    }

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

很难相信这是一个bug…您需要覆盖比较(对象o1,对象o2)
@Override public int compare(Object o1,Object o2){return compare((String)o1,(String)o2);}
您是否正在尝试实现标准的词法排序?你不是。你是按字符串的长度排序,然后在长度相同时按字母顺序排序。谢谢你,我发现了这个问题