2

Traversable[T] をカウント付きの Map[T, Int] ヒストグラムに変換したいと考えています。結果を、私がやることで得られるものと一致する不変の Map にしたいと思います:

traversable.groupBy(_).mapValues(_.length)

しかし、これは空間的にも時間的にも効率的ではないように見えます...トラバーサブルgroupBy内のすべての要素への参照を維持するため、これは、一意のキーの小さなセットを持つ大きなトラバーサブルではパフォーマンスが低下します。私は本当にこのようなものがもっと欲しいです:

def histogram[T](ts : Traversable[T]) : Map[T, Int] = {
  val map = new collection.mutable.HashMap[T, Int].withDefaultValue(0)
  ts.foreach { map(_) += 1 }
  map.toMap
}

この結果が得られるライブラリ メソッドはありますか (理想的には、並列コレクションでうまく機能します)。

4

3 に答える 3

1

t.foldLeft(Map.empty[Int, Int].withDefaultValue(0)) { (acc, i) => acc.updated(i, acc(i) + 1) }

于 2013-03-28T20:51:56.023 に答える
1

あなたの提案に非常によく似た私の拡張機能は次のとおりです。

implicit final class RichIterable[A](val it: TraversableOnce[A]) extends AnyVal {
  def histogram: Map[A, Int] = {
    var res = Map.empty[A, Int] withDefaultValue 0
    it.foreach { elem =>
      res += elem -> (res(elem) + 1)
    }
    res
  }
}

必ずしも最速のソリューションではありませんが、簡潔です:)

于 2013-03-28T20:18:47.927 に答える
0

ヒストグラム関数を使用してトラバーサブルをポンピングすることを検討します。traversable に "toHistogram[T]" を追加する暗黙のクラスを作成します。標準ライブラリには機能がないと思います。

于 2013-03-28T20:16:39.340 に答える