1

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._、あらゆる種類のものを使用してみました...無駄に。

4

1 に答える 1

2

これは で問題なく動作するようNumericです。Histogramにバインドされたコンテキストのためにトレイトを作成できないわけではありませんNが、IntHistogramandDoubleHistogramはトレイトにすることができます。

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)
    */
  }

}

abstract class Histogram[N:Numeric] extends collection.mutable.HashMap[String,N] {
  override def default(key:String) = implicitly[Numeric[N]].zero
  def descendingPairs = toList.sortBy(_._2).reverse
  override def toString = descendingPairs.mkString("\n")
}

trait IntHistogram extends Histogram[Int]
trait DoubleHistogram extends Histogram[Double]

ヒストグラムを特性にする必要がある場合は、次のようにします。

trait Histogram[N] extends collection.mutable.HashMap[String,N] {
  implicit val n:Numeric[N]
  override def default(key:String) = n.zero
  def descendingPairs = toList.sortBy(_._2).reverse
  override def toString = descendingPairs.mkString("\n")
}

ただし、メインで次のようにインスタンス化する必要があります。

val histogram = new Histogram[Int] { val n = implicitly[Numeric[Int]] }
于 2012-10-04T17:16:22.163 に答える