は(尾)再帰的な実装です。 scan
とCollections APIを使用する主な違いは、コンパイラがこれを通常は非常に速く実行されるwhile-loopに分解することです。
それを使用して
import scala.annotation.tailrec
def grouper(seq: List[(Double,Int)], delta: Double): Map[List[Double], List[(Double,Int)]] = {
@tailrec def loop(rest: List[(Double,Int)], last: Double, curGroup: List[(Double,Int)], allGroups: List[List[(Double,Int)]]): List[List[(Double,Int)]] = {
rest match {
case h::t if Math.abs(h._1 - last) <= delta => loop(t, h._1, h :: curGroup, allGroups)
case h::t => loop(t, h._1, h :: Nil, if(curGroup.nonEmpty) curGroup :: allGroups else allGroups)
case _ => if(curGroup.nonEmpty) curGroup :: allGroups else allGroups
}
}
val list = loop(seq, Double.NegativeInfinity, List.empty, List.empty)
list.map(x => (x.map(_._1), x)).toMap
}
:
> grouper(List((1.1, 2), (1.2, 3), (1.3, 4), (2.9, 5)), 0.2)
res1: Map[List[Double], List[(Double, Int)]] = Map(List(2.9) -> List((2.9, 5)), List(1.3, 1.2, 1.1) -> List((1.3, 4), (1.2, 3), (1.1, 2)))
あなたは '1.1、1.2、1.3、...、100.1、100.2'何を持っている場合は?これはどのようにグループ化されますか、1つのグループですか? – Psidom
'List((1.1,2)、(1.1、3)、(1.1、4)、(2.9、5))'の入力に期待される出力は? – jwvh
jwvh:3のグループ(1.1s)と1のグループ(2.9) –