:
- は降順での距離によって並べ替え5要素のリストをキープ(5が小さいため、ソートのコストは無視できる)。
- 各繰り返しで、元のリストの現在の要素の距離がhead要素の現在の要素よりも短い場合は、 5要素のリストは、head要素を現在の要素で置き換えます。 :特に反復を完了すると、現在の5要素のリスト
を保つ、5要素のリストは、TOP5リストを与える昇順に距離によって最短距離と最終選別を有する要素で構成されます
val list = Sighting.all.
iterator.
map(s => (s, haversineDistance(s, ourLocation))).
toSeq
// For example ...
res1: list = List(
("a", 5), ("b", 2), ("c", 12), ("d", 9), ("e", 6), ("f", 15),
("g", 9), ("h", 7), ("i", 6), ("j", 3), ("k", 10), ("l", 5)
)
val top5 = list.drop(5).
foldLeft(list.take(5).sortWith(_._2 > _._2))(
(l, e) => if (e._2 < l.head._2)
(e :: l.tail).sortWith(_._2 > _._2)
else
l
).
sortBy(_._2)
// top5: List[(String, Int)] = List((b,2), (f,3), (h,5), (a,5), (e,6))
[UPDATE]
以下はうまくいけばfoldLeft
式は以下圧倒的に見える上記top5
値の割り当ての詳細なバージョンです。ここで
val initialTop5Sorted = list.take(5).sortWith(_._2 > _._2)
val originalListTail = list.drop(5)
def updateTop5Sorted = (list: List[(String, Int)], element: (String, Int)) => {
if (element._2 < list.head._2)
(element :: list.tail).sortWith(_._2 > _._2)
else
list
}
val top5 = originalListTail.
foldLeft(initialTop5Sorted)(updateTop5Sorted).
sortBy(_._2)
は、ご参考のためfoldLeftの署名です:
def foldLeft[B](z: B)(op: (B, A) => B): B
https://en.m.wikipedia.org/wiki/Nearest_neighbor_search –
それ同じポイントセットと異なる場所でクエリを実行する頻度に依存します。 –