1

マップの配列とマップがあり、マップの配列で最大の日付を見つけたいと思います。この質問の部分を配線する方法がわからないため、非スカラパスに向かっていると思います一緒。

これを行うより良い方法はありますか?比較のために値を日付にキャストするなどのことを想定する必要があることを懸念していますが、それがマップにあり、マップには他のデータ型も含まれています(したがって、Map[String, Object] は私が持っているものです)

val df = new SimpleDateFormat("yyyy-MM-dd")     
def omap = List(Map("date" -> df.parse("2013-08-01")), Map("date" -> df.parse("2013-02-01"), "otherkey" -> "nothing special"), Map("date" -> df.parse("2013-01-01")))
omap.max(new Ordering[Map[String, Object]] {
  def compare(x: Map[String, Object], y: Map[String, Object]) = x.get("date").get.asInstanceOf[Date] compareTo y.get("date").get.asInstanceOf[Date]
}) 

コードは機能しているように見えますが、これを行うためのよりスカラ的な方法が欠けているように感じます。

4

3 に答える 3

2

この小さなワンライナーは機能しますが、マップに日付がない場合は例外がスローされます。

omap.flatMap(map => map.get("date").collect({case d:Date => d})).max

これはより安全なバージョンですが、デフォルトの日付を指定する必要があります:

  val defaultDate = new Date()
  omap.map(map => map.get("date").collect({case d:Date => d}))
    .foldLeft(defaultDate)((default, od) => od.fold(default)( d => if (d.compareTo(default) > 0) d else default))
于 2013-08-23T19:10:27.400 に答える
0
omap.maxBy{ _("date").asInstanceOf[Date] }
于 2013-08-23T18:26:39.283 に答える
0

型の数が最小限の場合は、おそらく のようなもので明示的にする必要がありますEither。しかし、そのためには多すぎると思います。

次に、値を取得するためのより標準的な方法は次のようなものです ( your を置き換えるomap.max):

val defaultDate = df.parse("1970-01-01")

def dateFrom(m: Map[String, Object]) =
  m.get("date").collect{ case d: Date => d }.getOrElse(defaultDate)

omap.maxBy(dateFrom)

これにより、欠落しているすべてのものを可能な限り早い日付にグループ化することで、エントリの欠落を防ぐことができます。

適切なデフォルトの日付がない場合は、

def dateFrom(m: Map[String, Object]) = m.get("date").collect{ case d: Date => d }
omap.max(new Ordering[Map[String, Object]] {
  def compare(x: Map[String, Object], y: Map[String, Object]) = {
    (dateFrom(x), dateFrom(y)) match {
      case (Some(a), Some(b)) => a compareTo b
      case (_, None) => -1
      case _         => 1
    }
  }
})

すべての日付のないマップを最後までシャッフルします。

于 2013-08-23T19:00:51.027 に答える