scala - Scala - 按可选字段排序,最后没有值
问题描述
我有以下课程:
final case class PowerDetails (
[...],
label: String,
title: String,
category: String,
idCategory: Option[String],
numCategory: Option[Int]
)
我需要对PowerDetails
这样的列表进行排序:
具有
idCategory
and 值的元素numCategory
应该在, 之前并按 andNone
排序 。至于值,它们需要按字段 , ,进行排序。idCategory
numCategory
None
category
title
label
如果可能的话,我想避免延长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))
你能帮我看看怎么做吗?谢谢。
解决方案
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)
}
推荐阅读
- flutter - UI中面临的问题[颤振]
- python - Python Matplotlib:for循环中的savefig图
- eclipse - 如何更改配置文件以获取正确的 java 位置以运行 scala ide - “返回的退出代码 1”
- python - 如何在本地 Jupyter Notebook 中进行离线作业?
- android - 如何在自定义下载器中使用 glide
- java - 使用两个不同的随机数选项初始化变量时遇到问题
- amazon-web-services - 尽管将有效的数据库标识符传递给配置,Sequelize.js AWS RDS 未知数据库
- google-cloud-platform - TCP连接被直通负载均衡器强行关闭?
- javascript - 是否可以将我的 bootstrap .js 函数与其他 bootstrap 版本“隔离”?
- node.js - 在 Puppeteer 中使用 browser.pages() 切换到新选项卡