1

この質問をするためのより良い方法があるに違いないと思いますが、思いつきませんでした。

次のケース クラスを検討してください。

case class UserLocation(id: Int, dateTime: DateTime, lat: Double, lon: Double)

すべてList[UserLocation]のユーザーのすべての場所の履歴があり、このリストをフィルタリングして、各ユーザーの最新の場所のみを取得したいと考えています。

これが私がやった方法です:

implicit def dateTimeOrdering: Ordering[DateTime] = Ordering.fromLessThan(_ isAfter _)

val locations: List[UserLocation] = bigListOfUserLocations()
val groupedById  = locations.groupBy(_.id)
val sortedByDate = groupedById.map(_._2.sortBy(_.dateTime))
val finalList    = sortedByDate.map(_.head)

これはうまくいきますが、私が知りたいのは、これを行うためのより良い方法があれば、パフォーマンスや読みやすさを改善することです

重要:これは主に学術的な質問です。リストを操作してこれを達成するための最もパフォーマンス的または最も慣用的な方法を知りたいので、「リストを受け取る前にデータベースで xyz を試してください」などの提案は役に立ちません。

4

2 に答える 2

0

@Iadamsで既に述べたように、ここでソートする必要はありません。O(n)私のソリューションは読みやすさを改善しませんが、ユーザーのすべての場所を保存するのではなく、最新の場所をリストの 1 回のパスで保存するため、パフォーマンスは少し改善されます (まだです)。

locations
    .foldLeft(mutable.Map.empty[Int, UserLocation]) {
      case (acc, loc)
        if !acc.contains(loc.id) ||
          acc(loc.id).dateTime < loc.dateTime => acc.updated(loc.id, loc)
      case (acc, _) => acc
    }.map(_._2)
于 2016-08-24T01:06:54.643 に答える