当前位置: 首页 > 知识库问答 >
问题:

使用Double.NaN的自定义比较器对Double列表进行排序

齐才艺
2023-03-14

我有以下清单:

scala>  List(Double.NaN, 0.0, 99.9, 34.2, 10.98, 7.0, 6.0, Double.NaN, 5.0, 2.0, 0.56, Double.NaN, 0.0, 10.0)
res0: List[Double] = List(NaN, 0.0, 99.9, 34.2, 10.98, 7.0, 6.0, NaN, 5.0, 2.0, 0.56, NaN, 0.0, 10.0)

这是我的比较器函数:

scala> def sortAscendingDouble(d1:Double, d2:Double) = {
     | if(d1.isNaN && !d2.isNaN)
     | d1 < d2
     | else if(!d1.isNaN && d2.isNaN)
     | d2 < d1
     | else d1< d2
     | }
sortAscendingDouble: (d1: Double, d2: Double)Boolean

我正在尝试使用它排序如下:

scala> res0.sortWith((d1, d2)=> sortAscendingDouble(d1, d2))
res1: List[Double] = List(NaN, 0.0, 0.0, 0.56, 2.0, 5.0, 6.0, 7.0, 10.0, 10.98, 34.2, 99.9, NaN, NaN)

我不明白为什么第一个NaN不在列表的末尾。

我对升序排序列表的预期输出是:

List(0.0, 0.0, 0.56, 2.0, 5.0, 6.0, 7.0, 10.0, 10.98, 34.2, 99.9, NaN, NaN, NaN)

我对降序排序列表的预期输出是:

List(99.9, 34.2, 10.98, 10.0, 7.0, 6.0, 5.0, 2.0, 0.56, 0.0, 0.0, NaN, NaN, NaN

在升序排序和降序排序的情况下,我希望NaNs在最后。

我知道sortwith使我们能够编写自己的比较器。有人能帮我吗?

共有1个答案

姬慎之
2023-03-14

问题是,将任何数字(包括Nan本身)与NaN进行比较将总是返回< code>false。因此,您的第三个条件是错误的,因为< code>d2

/** Compares two doubles and returns true if the first value is equals or less than the second */
def sortAscendingDouble(d1: Double, d2: Double): Boolean =
  if (d1.isNaN && d2.isNaN)
    false // doesn't matter if true or false.
  else if(d1.isNaN && !d2.isNaN)
    false // NaN always goes after any non-NaN double.
  else if(!d1.isNaN && d2.isNaN)
    true // NaN always goes after any non-NaN double.
  else
    d1 < d2 // Standard double comparison. This should take care of any repetitive Doubles

/** Compares two doubles and returns true if the first value is equals or greater than the second */
def sortDescendingDouble(d1: Double, d2: Double): Boolean =
  if (d1.isNaN && d2.isNaN)
    false // doesn't matter if true or false.
  else if(d1.isNaN && !d2.isNaN)
    false // NaN always goes after any non-NaN double.
  else if(!d1.isNaN && d2.isNaN)
    true // NaN always goes after any non-NaN double.
  else
    d1 > d2 // Standard double comparison. This should take care of any repetitive Doubles

list.sortWith(sortAscendingDouble)
// List[Double] = List(0.0, 0.0, 0.56, 2.0, 5.0, 6.0, 7.0, 10.0, 10.98, 34.2, 99.9, NaN, NaN, NaN)

list.sortWith(sortDescendingDouble)
// List[Double] = List(99.9, 34.2, 10.98, 10.0, 7.0, 6.0, 5.0, 2.0, 0.56, 0.0, 0.0, NaN, NaN, NaN)
 类似资料:
  • 问题内容: 我知道有几个这样的问题,但是它们似乎对我没有用。 我有一个列表,5元素乘以50。我想通过对每个元素应用自定义比较功能来对列表进行排序。此函数计算要对元素进行排序的列表的适用性。我创建了两个函数,比较和适应性: 和 然后我尝试通过以下方式致电给他们: 要么 要么 要么 我也尝试了具有相同参数的list.sort()。但是无论如何,函数都不会将列表作为参数,而是作为参数。我不知道为什么,这

  • 我一直在做拼字游戏作业。我需要从列表中读取单词,然后读取每个字符并赋值,最终为每个单词分配一个总分。已经完成了!唷。现在我需要使用比较器将单词从最高分到最低分进行排序。读了很多,还是很迷茫。我知道我可以使用接口,但也有使用lambda表达式的比较器,这是我想去的方向。我只是不知道该怎么做。我需要比较每个单词的sumValue,然后按降序打印单词。 我创建了 2 个循环来读取单词 (i),然后是字符

  • 问题内容: 我需要使用自定义比较器对整数数组进行排序,但是Java的库没有为带有比较器的整数提供排序功能(比较器只能与对象一起使用)。有没有简单的方法可以做到这一点? 问题答案: 如果你无法更改输入数组的类型,则将执行以下操作: 这可以使用ArrayUtilscommons-lang项目轻松地在和之间进行转换,创建数组的副本,进行排序,然后将排序后的数据复制到原始数据上。

  • 如何使用Comparator对对象的ArrayList进行正确排序,然后将排序后的数组传递给自定义数组适配器? 我试过这样做: ArrayList的内容类: 比较器: 在OnCreate中设置适配器: ...因为我使用的是定制的ArrayAdapter,就像: 我需要如何修改此适配器以使其与其他适配器一起工作? 谢谢你的帮助。

  • 我有两个包含该类对象的列表: 我想通过学生比较一下那两个列表中的对象。我得比较一下列表然后得到下面的数据 我需要创建一个新列表,其中包含中存在但不在中的 对象 我需要创建一个新列表,其中包含那些对象,这些对象存在于中,但不存在于中 我需要创建一个新列表,其中包含使用java8流出现在两个列表中的对象 我尝试使用下面的代码 查找获得TC的学生(存在于列表1中但不存在于列表2中) 查找新的许可(存在于

  • 我有一个用类填充的树集。我想让这些按其继承排序,否则,只按其名称的字母顺序(以创建一个恒定的顺序)。但是由于某种原因,如果添加的类的顺序不正确,就会导致类的顺序不正确。 这是我的比较器: 下面是一个测试失败的例子: 排序集的实际值: 我的期望更像是: 我在调试时确实注意到,并非每个项目都相互比较。