首页 > 解决方案 > Scala排序存在问题

问题描述

val population: List[Animal] = for (animal <- animals) yield {
    val value: T = incubator(animal.genes)
    new Animal(animal.genes, costFunction(value))
  }
  for (x<-population){
    println(x.cost + " " + x.genes)
  }

  println("sorted:")

  val orderedAnimals: List[Animal] = population.sortWith(_.cost < _.cost)
  for (i<-orderedAnimals){
    println(i.cost + " " + i.genes)
  }
  println("-------------------")
  println()

所以我有一个动物对象列表(动物有两个属性;基因:List[Double] 和成本:Double。我试图按成本值的顺序对它们进行排序,最低成本->最高成本,但我遇到错误。

这是我运行程序时打印的内容,而不是按成本值排序,而是按基因列表中第一个双精度值的绝对值排序。有人知道我在做什么错吗?

标签: scalasorting

解决方案


tl;博士您的程序是正确的。您忽略了科学计数法中的指数。

由于我们可以用来尝试向您显示的数据是在图像中,所以我继续并“OCR-ed”了它。并做了这个:

scala> List(6.434636141757189E8, 6.048938092998665E9, 4.08466301816955E9, 2.038557228389767E10).sorted // copied from the first block (before "sorted")
res1: List[Double] = List(6.434636141757189E8, 4.08466301816955E9, 6.048938092998665E9, 2.038557228389767E10)

scala> List(6.434636141757189E8, 4.08466301816955E9, 6.048938092998665E9, 2.038557228389767E10) // copied from the 2nd block (after "sorted:")
res2: List[Double] = List(6.434636141757189E8, 4.08466301816955E9, 6.048938092998665E9, 2.038557228389767E10)

为了证实我们的假设,我们可以做一个小实验:

scala> List(6.434636141757189E8, 6.048938092998665E9, 4.08466301816955E9,
 2.038557228389767E10).sorted.sliding(2)
  .toList.collect{ case List(small, big) => small < big } // (*)
res7: List[Boolean] = List(true, true, true)

QED :)

(*) sliding(2)

scala> List(1,2,3,4).sliding(2).toList
res8: List[List[Int]] = List(List(1, 2), List(2, 3), List(3, 4))

推荐阅读