2

我有以下课程:

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))

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

4

2 回答 2

3

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)
}
于 2020-01-29T19:33:35.573 回答
2

这对你有用吗?

implicit val PDOrd :Ordering[PowerDetails] = Ordering.by(
  pd => (pd.idCategory.getOrElse("~~~~")
       , pd.numCategory.getOrElse(Int.MaxValue)
       , pd.category
       , pd.title
       , pd.label ))

诚然"~~~~",这不是String宇宙的尽头,但它应该在大多数情况下都有效。

于 2020-01-29T18:30:25.653 回答