排序Seq [scala.collection.immutable.Map [String,org.joda.time.DateTime]]

时间:2018-04-10 21:18:39

标签: scala sorting collections hive

我在scala中有Seq of Map,它来自hive分区。

我需要从以下Seq of Map

获取最新/ recentbusinessdate
import org.joda.time.DateTime

val a = Seq(
 Map("businessdate" -> DateTime.parse("2018-03-23T00:00:00.000Z")),
 Map("businessdate" -> DateTime.parse("2018-03-24T00:00:00.000Z")),
 Map("businessdate" -> DateTime.parse("2018-03-22T00:00:00.000Z")),
 Map("businessdate" -> DateTime.parse("2018-03-21T00:00:00.000Z"))
)

预期产出是最近营业日期的地图。即。

Map("businessdate" -> DateTime.parse("2018-03-24T00:00:00.000Z")

我尝试使用sortWith对此seq的地图进行排序,但结果却是错误的结果

val b = a.map(x => new DateTime( x.get("businessdate").get)
  .isAfter(new DateTime( x.get("businessdate").get)))
println(b)

我是scala的新手。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

使用sortWith获取最新的营业日期:

val mapWithMostRecentBusinessDate = a.sortWith(
  (a, b) => a("businessdate").isAfter(b("businessdate"))
).head

println(mapWithMostRecentBusinessDate) 

输出Map(businessdate -> 2018-03-24T00:00:00.000Z)

使用foldLeft的另一种方式,可能比排序整个Seq更高效,因为 O(n)

val mapWithMostRecentBusinessDate = a.foldLeft(a.head)(
  (acc, b) =>
    if (b("businessdate").isAfter(acc("businessdate")))
      b
    else
      acc
)

println(mapWithMostRecentBusinessDate)

输出Map(businessdate -> 2018-03-24T00:00:00.000Z)