私は実際にこれで約4時間ブロックされています。ペアのリスト[String、Int]をint値順に取得したいと思います。関数の分割は正常に機能するので、bestNが必要ですが、これをインタープリターにロードすると、次のようになります。
<console>:15: error: could not find implicit value for evidence parameter of type Ordered[T]
私の述語で。誰かが問題が何であるかを見ていますか?私は今本当に必死です...
これはコードです:
def partition[T : Ordered](pred: (T)=>Boolean, list:List[T]): Pair[List[T],List[T]] = {
list.foldLeft(Pair(List[T](),List[T]()))((pair,x) => if(pred(x))(pair._1, x::pair._2) else (x::pair._1, pair._2))
}
def bestN[T <% Ordered[T]](list:List[T], n:Int): List[T] = {
list match {
case pivot::other => {
println("pivot: " + pivot)
val (smaller,bigger) = partition(pivot <, list)
val s = smaller.size
println(smaller)
if (s == n) smaller
else if (s+1 == n) pivot::smaller
else if (s < n) bestN(bigger, n-s-1)
else bestN(smaller, n)
}
case Nil => Nil
}
}
class OrderedPair[T, V <% Ordered[V]] (t:T, v:V) extends Pair[T,V](t,v) with Ordered[OrderedPair[T,V]] {
def this(p:Pair[T,V]) = this(p._1, p._2)
override def compare(that:OrderedPair[T,V]) : Int = this._2.compare(that._2)
}
編集:最初の関数は、すべてのメンバーに述語を適用することによってリストを2つに分割します。bestN関数は、リストリストの最下位n個のメンバーのリストを返す必要があります。そして、クラスはペアを比較可能にするためにあります。この場合、私がしたいことは次のとおりです。
val z = List(Pair("alfred",1),Pair("peter",4),Pair("Xaver",1),Pair("Ulf",2),Pair("Alfons",6),Pair("Gulliver",3))
この与えられたリストで私は例えば以下で取得したいです:
bestN(z, 3)
結果:
(("alfred",1), ("Xaver",1), ("Ulf",2))