【问题标题】:Java 8 Collections.sort - Simple typo [closed]Java 8 Collections.sort - 简单的错字[关闭]
【发布时间】:2014-04-28 07:56:18
【问题描述】:

基本上我有两个比较器(Comparator1 和 Comparator2),它们的实现略有不同。两者都应按行名称长度的降序对列表进行排序。

Comparator2 似乎不适用于 java7/java8。 Comparator1 始终有效。 两者都适用于 java 1.6 实现,或者如果我设置 -Djava.util.Arrays.useLegacyMergeSort=true。 如果 Comparator2 中存在问题,java 应该抛出 IllegalArgumentException,但不会抛出异常。

这在 java 文档中被描述为 “java.util.Arrays.sort 和(间接)java.util.Collections.sort 使用的排序算法已被替换。新的排序实现如果检测到违反 Comparable 合同的 Comparable 可能会抛出 IllegalArgumentException”

这是 JRE 中的错误还是 Comparator2 有问题?

public class Main {

public static void main(String[] args) {
    Row row1 = new Row("AAAA");
    Row row2 = new Row("BBB");
    Row row3 = new Row("CC");
    Row row4 = new Row("D");

    List<Row> list1 = new ArrayList<Row>();
    list1.add(row2);
    list1.add(row3);
    list1.add(row1);
    list1.add(row4);

    System.out.println("Before sorting:");
    System.out.println("");

    print(list1);

    Collections.sort(list1, new Comparator2());

    System.out.println("After sorting with comparator2:");
    System.out.println("");

    print(list1);

    Collections.sort(list1, new Comparator1());

    System.out.println("After sorting with comparator1:");
    System.out.println("");

    print(list1);

}

private static void print(List<Row> list) {
    for (Row row : list) {
        System.out.println(row.name);
    }
}

}

public class Row {

String name;

public Row(String name) {
    this.name = name;
}

public int getLength() {
    return name.length();
}

}

public class Comparator1 implements Comparator<Row> {
@Override
public int compare(Row o1, Row o2) {
    Integer length1 = o1.getLength();
    Integer length2 = o2.getLength();
    return -1 * length1.compareTo(length2);
}
}

public class Comparator2 implements Comparator<Row> {

@Override
public int compare(Row o1, Row o2) {
    int length1 = o1.getLength();
    int length2 = o2.getLength();

    if (length1 < length2) {
        return 1;
    } else if (length2 > length1) {
        return -1;
    } else {
        return 0;
    }

}

}

【问题讨论】:

  • 听起来x.compare(y)y.compare(x) 可能不一致-您可以发布比较器的代码吗?
  • 你忘了告诉什么不工作或什么是错的。

标签: java sorting java-7 java-8


【解决方案1】:

Comparator2 中的前两个条件基本相同:

if (length1 < length2) {
    return 1;
} else if (length2 > length1) {
    return -1;
}

else if 更改为length1 &gt; length2,它应该可以工作。

【讨论】:

  • Integer.compare(length1, length2) 更具可读性且不易出错。
  • @ThomasJungblut 没错,但问题是Comparator2 出了什么问题;)
  • 好收获!但是,这意味着这个问题可以说是“简单的印刷错误”;)
猜你喜欢
  • 2015-01-18
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2011-01-25
  • 2018-02-14
  • 2016-05-10
  • 1970-01-01
相关资源
最近更新 更多