【问题标题】:Java Comparator Sort DifferentlyJava比较器排序不同
【发布时间】:2017-03-30 05:33:45
【问题描述】:

公共类 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 实现比较器 {

@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;
    }
}

}

公共类 StringComparator2 实现比较器 {

@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;
    }
}

}

我必须使用比较器对字符串对象进行排序,结果“StringComparator”有一些错误,但我无法弄清楚。

"StringComparator" 工作正常 “Arrays.sort(b, new StringComparator());” 输出顺序符合预期。

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

" 数组.sort(a); Arrays.sort(a, new StringComparator());"

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

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

【问题讨论】:

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

标签: java string comparator


【解决方案1】:

这可行 - 在 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)的结果相同

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

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

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

【讨论】:

  • 谢谢我找到问题了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多