比较器排序

时间:2017-07-25 09:09:14

标签: java sorting collections comparator

请找到以下代码:

PercentTextbox

对于某些输入,它会抛出以下错误:

UserControl

请帮忙!

4 个答案:

答案 0 :(得分:3)

我假设你在问题中有拼写错误,比较方法的实际签名是int compare(Long m1, Long m2),或者你的代码根本不会通过编译,这不是你描述的问题。

实际问题是你试图通过将两个长片之间的差异转换为int来比较它们。当差异不在int类型的范围内时,这可能会给您不正确的结果。如果您不想依赖return m2.compareTo(m1)的{​​{1}}实施,则可以使用return m2 < m1 ? -1 : m2 > m1 ? 1 : 0代替Long

答案 1 :(得分:2)

这样做:

    Comparator<Long> d = new Comparator<Long>() {
        public int compare(long m1, long m2) {
            return (int) (m2 - m1);
        }
    };

NOT 在比较器接口

中实现抽象方法相同
public int compare(T a1, T a2);

所以你的代码没有编译

你应该使用(是java8)方法参考

Comparator<Long> d = Long::compare;

但是这有什么问题:(int) (m2 - m1);你可能会问自己......

你正在强制将2 a长度转换为整数,因此结果可以是非常负的Long或正整数

检查此示例以澄清:

    long b = 1000_000_000_000_000L;
    long a = 100L;
    System.out.println(a - b);
    System.out.println((int) (a - b));

结果是 很久

  

-999999999999900

as int

  

1530495076

这肯定打破了比较结果

答案 2 :(得分:0)

    List<Long> list = Arrays.asList(3L, 2L, 1L);

    list.sort(new Comparator<Long>() {
        @Override
        public int compare(Long o1, Long o2) {
            return o1.compareTo(o2);
        }
    });

    System.out.println(list);

OR:

    List<Long> list = Arrays.asList(3L, 2L, 1L);
    list.sort(Long::compareTo);
    System.out.println(list);

答案 3 :(得分:0)

这里有两件事值得一提:

  • 总是在你写下你认为应该覆盖的方法时使用@Override。然后编译器可以告诉你什么时候出错了(在你的情况下,签名期望Long,但你用得很长)
  • 避免重新发明轮子,即使只是为了逆转比较。

换句话说:而不是做

int compare(Long l1, long l2) {
  return l2 - l1;
你可以这样做:

  return l2.compareTo(l1);

代替。这更容易阅读;和表现基本相同。