IntHistogram は単語をカウントし、降順で表示します。
object IntHistogram {
def main(args: Array[String]) {
val wordsToCount = "foo foo bar foo bar wtf foo bar".split(" ")
val histogram = new IntHistogram
for (word <- wordsToCount) histogram(word) += 1
println(histogram)
/*
(foo,4)
(bar,3)
(wtf,1)
*/
}
}
class IntHistogram extends collection.mutable.HashMap[String,Int] {
override def default(key:String) = 0
def descendingPairs = toList.sortBy(_._2).reverse
override def toString() = descendingPairs.mkString("\n")
}
DoubleHistogram が必要でしたが、一般的な "Histogram[NumberSuperClassOfIntAndDouble]" 特性を定義する方法がわからなかったため、コピー アンド ペーストに頼りました。
class DoubleHistogram extends collection.mutable.HashMap[String,Double] {
override def default(key:String) = 0
def descendingPairs = toList.sortBy(_._2).reverse
override def toString() = descendingPairs.mkString("\n")
}
賢い/知識のある人は、そのようなスーパートレイトを定義する方法を教えてくれるので、醜いコピーアンドペーストのボイラープレートを避けることができますか?
前もって感謝します、
PT
PS ヒストグラムを特性にしたいので、ヒストグラムの動作を任意の数値マップに混在させることができます。実際には、降順の toString メソッド以外にも、必要な動作がたくさんあります。この質問のために単純化しました。ここで Num は、Int と Double の架空の数値スーパークラスです。
trait Histogram[Num] extends collection.Map[String,Num] {
override def default(key:String) = 0
def descendingPairs = toList.sortBy(_._2).reverse
override def toString() = descendingPairs.mkString("\n")
}
Numeric、Number、import Ordering.Implicits._、あらゆる種類のものを使用してみました...無駄に。