当前位置: 首页 > 面试题库 >

为什么我的简单比较器坏了?

满博
2023-03-14
问题内容

我有一堂课,我已经简化为:

final class Thing {
    private final int value;
    public Thing(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
    @Override public String toString() {
        return Integer.toString(value);
    }
}

我想对这个东西进行排序。所以我创建了一个简单的copmarator:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
        return a.getValue() - b.getValue();
    }
};

然后,我使用的两个参数形式Arrays.sort

这对于我的测试用例来说很好用,但是有时由于数组以奇怪但可重复的顺序结束而完全出错。怎么会这样?


问题答案:

整数溢出…或更确切地说是下溢。

相反,进行显式比较:

private static final Comparator<Thing> reverse = new Comparator<Thing>() {
    public int compare(Thing a, Thing b) {
      int av = a.getValue(), bv = b.getValue();
      return (av == bv) ? 0 : ((av < bv) ? -1 : +1);
    }
};

如果您确定差异不会“绕回”,则可以使用减法。例如,当所讨论的值被约束为非负数时。



 类似资料:
  • Java 7更改了排序算法,从而抛出 java.lang.IllegalArgumentException:“比较方法违反了其总合同!” 在某些情况下,当使用的比较器有故障时。是否可以确定比较器中的哪种错误导致了这种情况?在我的实验中,如果x!=x,如果x也没有关系 (如果有一个通用的规则,在比较器中寻找bug可能会更容易。但是当然最好是修复所有的bug。:-) ) 特别是,以下两个比较器没有让T

  • “Zed”应该是第二名,但他是最后一名。有什么想法可以修复这个逻辑吗?

  • 问题内容: Github的安全webhooks页面说: 不建议使用普通运算符。类似的方法执行“恒定时间”字符串比较,从而使其免受常规正则运算符的某些定时攻击。 我在比较密码时使用。 是什么使它成为“安全比较”,我可以使用Node中的标准库来做到这一点吗? 问题答案: “恒定时间”字符串比较的意义在于,无论比较目标是什么(未知值),该比较将花费完全相同的时间量。此“恒定时间”不会向攻击者显示有关未知

  • 主要内容:大学生比较简单的自我介绍(篇1),大学生比较简单的自我介绍(篇2),大学生比较简单的自我介绍(篇3),大学生比较简单的自我介绍(篇4),大学生比较简单的自我介绍(篇5),大学生比较简单的自我介绍(篇6),大学生比较简单的自我介绍(篇7),大学生比较简单的自我介绍7篇 大学生比较简单的自我介绍?自我介绍是我们在很多场合都会用到的一种语言,那么你知道怎么样的自我介绍简单又有内容呢?下面小编给大家带来了大学生比较简单的自我介绍,供大家参考。 大学生比较简单的自我介绍(篇1) 主考官您好,我叫

  • 所以我正在学习Comparator和Comparable,我有以下问题。我有一门课: 另一个类Name实现了可比较的,在构造函数中有两个String。我不完全理解的是比较器的功能,我读过Java留档,我知道它用于对元素进行不同的排序,而不改变我的例子中的名称类它也可以在某些情况下允许空值,但是这个我的类构造函数中的声明工作正常,我根本不需要在PhoneBook类中实现比较器接口: 并实现了我希望它

  • 2)在火花中: 同样的,在Spark中需要30秒,在Python中需要1秒。 我的Spark比纯Python慢得多的几个可能原因: