【问题标题】:sorting of ZonedDateTime in ScalaScala 中 ZonedDateTime 的排序
【发布时间】:2021-11-11 12:20:51
【问题描述】:

我有以下 ZonedDateTime 列表,它基本上是从 Scala 中的 xml 字段中读取的:

var timestamps =  List[ZonedDateTime]()
timestampNodes.foreach(node => timestamps = timestamps :+ ZonedDateTime.parse(node.text, DateTimeFormatter.ISO_OFFSET_DATE_TIME))

对时间戳列表进行排序以便条目从最旧到最新排序的最佳和最快方法是什么?

【问题讨论】:

标签: scala sorting zoneddatetime


【解决方案1】:

.sortWith() 应该可以工作。

import java.time.{ZonedDateTime => ZDT}

val sortedtimestamps: List[ZDT] =
  timestampNodes.map(node => ZDT.parse(node.text))
                .sortWith(_.isBefore(_))

Scala 2.11.12 通过Scastie 测试。

【讨论】:

  • 我有一个 node.text 为空的情况。所以上面的地图抛出异常。如果我在映射中引入 if,则 sortwith 不起作用,因为 map() 的类型从 Seq[ZDT] 更改为 Seq[Any]。如何处理?
  • 如果“空”是指"",那么您可以在.map(... 之前添加.filter(_.text.nonEmpty),或者您可以将.map() 更改为.collect{case node if node.text.nonEmpty => ...
  • 谢谢。我用它来解决问题:.filter(_.text.trim.nonEmpty)
【解决方案2】:

ZonedDateTime实现Ordering,你可以使用List.sorted

import java.time._
import scala.math.Ordering.Implicits._

implicit val zonedDateTimeOrdering: Ordering[ZonedDateTime] =
    _ compareTo _

val base = ZonedDateTime.of(
    LocalDate.of(2021, 1, 1),
    LocalTime.MIDNIGHT,
    ZoneOffset.UTC
)

List(
    base.plusHours(1),
    base.plusHours(4),
    base.plusHours(2)
).sorted      // ==> a list with oldest first

已在 Scala 2.13 上测试过,但应该适用于 Scala 2.12 及更高版本。

奖金

添加导入,您可以将 ZonedDateTime 变量与<<=> 等进行比较。

import scala.math.Ordering.Implicits._

base <= base.plusMinutes(10) // ==> true

【讨论】:

    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2020-12-03
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多