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

比较两个通用数字的值

司徒炎彬
2023-03-14
问题内容

我想比较两种类型的变量T extends Number。现在,我想知道两个变量中的哪个大于另一个或相等。不幸的是,我还不知道确切的类型,我只知道它将是的子类型java.lang.Number。我怎样才能做到这一点?

编辑
:我尝试了使用TreeSets的另一种解决方法,它实际上可以自然排序(当然,除了AtomicInteger和AtomicLong之外,Number实现的所有子类都可以工作Comparable)。因此,我将丢失重复的值。使用Lists时,Collection.sort()由于绑定不匹配,将不接受我的列表。非常不满意。


问题答案:

一个有效的(但脆弱的)解决方案是这样的:

class NumberComparator implements Comparator<Number> {

    public int compare(Number a, Number b){
        return new BigDecimal(a.toString()).compareTo(new BigDecimal(b.toString()));
    }

}

不过,它仍然不是很好,因为它依靠toString返回一个可解析的值BigDecimal(标准Java
Number类可以执行此操作,但是Number合同不需要)。

七年后编辑: 正如评论中指出的那样toString,您需要考虑以下三种(至少?)特殊情况:

  • Infinity,它等于所有事物,除了等于它的自身之外
  • -Infinity,它等于所有事物,除了等于它的自身
  • NaN,比较起来比较NaN``false费力/不可能,因为所有与之比较的结果都会产生,包括检查自身是否相等。


 类似资料:
  • 问题内容: 我有一个简单的疑问。如果有人帮助我,那就太好了。 我有两个字符串: 这两个值相等,但是如何在Java中比较它们呢?我们拥有并用于比较字符串alpha值,类似地,如何比较数字值。 问题答案: 这就对了。您可以使用方法将数字字符串转换为整数,该方法将返回类型。然后比较与相同。

  • 过滤出数组中比较函数不返回 true 的所有值。 类似于difference ,除了接受一个 comparator (比较函数)。 使用 Array.filter() 和 Array.findIndex() 来查找合适的值。 const differenceWith = (arr, val, comp) => arr.filter(a => val.findIndex(b => comp(a, b

  • 问题内容: 我有一个带有〜已知二进制序列的字节数组。我需要确认二进制序列是应该的。除之外,我还尝试了其他方法,但均无济于事。 问题答案: 在您的示例中,您具有: 在处理对象时,java中会比较 参考值 。您正在检查对by返回的数组的引用是否与所保存的引用相同,这当然永远不会正确。此外,数组类不会覆盖,因此其行为仅是比较参考值。 为了比较两个数组的 内容 ,Arrays类提供了静态数组比较方法。

  • 问题内容: 更新:我应该早点指定它,但是并非所有名称都只是浮点数。例如,其中一些以“ YT”为前缀。因此,例如“ YT1.1。所以,您遇到相同的问题,YT1.9 <YT1.11应该为真。我真的很惊讶字符串比较失败…。 您好,这应该是一个非常简单的问题,但我似乎找不到答案。我想按名称对一堆XL工作表进行排序。每个名称都是数字,但与教科书“节”的编号方式相同,这意味着第4.11节在4.10之后,在4.

  • 问题内容: 我有这个间隔,当前每5秒执行一次ajax请求。我对声明有疑问。我的代码总是输入它,并且两个json值完全相同,为什么它认为它们不同? 编辑 这是控制台输出(虚线是分隔请求,它不在实际输出中) 问题答案: 不能保证以相同的方式序列化JSON对象,也不能保证属性以相同的顺序进行序列化,使用并不是测试对象相等性的好方法。 一个更好的例子是这样的函数(前一段时间在互联网上找到,希望我能感谢原始

  • 我有一个简单的javascript问题,我真的需要一些帮助!我正在尝试弄清楚如何在数组之间比较元素,以及在下一个循环中再次比较较大的元素。假设我们有数组A和数组B。 我的问题是,在比较索引处的元素之后,我希望在下一个循环周期中比较较大的元素。 如果A=[5,7,4],B=[2,8,5] 在第一个循环中,5与2进行比较,2较小,因此会发生一些事情。在下一个循环周期中,我希望5与8进行比较,而对于现在