首页 > 解决方案 > Scala - 按可选字段排序,最后没有值

问题描述

我有以下课程:

final case class PowerDetails (
  [...],
  label: String,
  title: String,
  category: String,
  idCategory: Option[String],
  numCategory: Option[Int]
)

我需要对PowerDetails这样的列表进行排序:

具有 idCategory and 值的元素numCategory 应该在, 之前并按 and None排序 。至于值,它们需要按字段 , ,进行排序。idCategorynumCategoryNonecategorytitlelabel

如果可能的话,我想避免延长Ordered

final case class PowerDetails (

   ...

) extends Ordered[PowerDetails] {

    override def compare(that: PowerDetails): Int = {
       // Define here the comparison
    }

}

我尝试如下创建一个订购,然后使用该sorted功能,但我得到一个NullPointerException

  implicit val orderingPowers = optionOrdering.thenComparing(ordering)

  val ordering: Ordering[PowerDetails] = Ordering[(String, String, String)]
    .on[PowerDetails](powerDetail =>
      ( powerDetail.category, powerDetail.title, powerDetail.label))

  val optionOrdering : Ordering[PowerDetails] = Ordering[(Option[String], Option[Int])]
    .on[PowerDetails](powerDetail =>
      (powerDetail.idCategory, powerDetail.numCategory))

你能帮我看看怎么做吗?谢谢。

标签: scalasortingoptional-values

解决方案


Here's another approach also using Ordering.by along with Option's isEmpty, leveraging false < true for the wanted Some/None ordering:

final case class PowerDetails (
  field1: String,
  field2: Int,
  label: String,
  title: String,
  category: String,
  idCategory: Option[String],
  numCategory: Option[Int]
)

implicit val PDOrderer: Ordering[PowerDetails] = Ordering.by{
  case PowerDetails(_, _, label, title, cat, idCat, numCat) =>
    (idCat.isEmpty, idCat, numCat.isEmpty, numCat, cat, title, label)
}

推荐阅读