如何实现Ordering[Option[String]]自定义排序:None后置、String正常排序
自定义Option[String]排序规则(None后置)
要实现将None排在所有Some之后、同时Some内的字符串按常规字典序排序的需求,你可以通过两种方式定义对应的Ordering[Option[String]]:
方式一:利用元组映射快速实现
通过Ordering.by将Option转换为带优先级的元组,借助元组默认的排序逻辑完成需求:
val scoreSeq_option: Seq[Option[String]] = List(Some("ngksf"), Some("fmgfdmg"), Some("mbmd"), None) val nullOrdering: Ordering[Option[String]] = Ordering.by { case Some(s) => (0, s) case None => (1, "") } // 执行排序并验证结果 val sortedSeq = scoreSeq_option.sorted(nullOrdering) // 输出:List(Some(fmgfdmg), Some(mbmd), Some(ngksf), None)
逻辑说明
- 给
Some标记优先级0,None标记优先级1,元组排序会先比较优先级,确保所有Some排在None之前 - 优先级相同时,比较元组的第二个元素(即
Some内的字符串),遵循常规字典序排序
方式二:手动实现Ordering.compare方法
如果你需要更直观的控制逻辑,可以直接实现Ordering的compare方法:
val nullOrdering: Ordering[Option[String]] = new Ordering[Option[String]] { override def compare(a: Option[String], b: Option[String]): Int = (a, b) match { case (Some(s1), Some(s2)) => s1.compareTo(s2) // 两个Some,比较内部字符串 case (Some(_), None) => -1 // Some在前,返回-1表示a < b case (None, Some(_)) => 1 // None在后,返回1表示a > b case (None, None) => 0 // 两个None相等 } }
逻辑说明
- 针对四种组合情况分别处理:两个
Some比较字符串、Some和None比较时让Some靠前、两个None视为相等
内容的提问来源于stack exchange,提问作者user20280341
相关产品推荐
相关产品推荐

