3

Seq[SalesRow]アプリケーションのいくつかの異なる場所で、 を取得してを返す必要がありますMap[String,SalesRow]。ここで、文字列は国の名前です。

これをいくつかの場所で使用する必要があります。たとえば、すべての SalesRows のリストを取得して、国ごとの売上高のグローバルな内訳を取得します。しかし、他の場所では、売上を月ごと、次に国ごとに分類したいと考えています (つまり、 にMap[Month,Seq[SalesRow]]なりますMap[Month,Map[String,Seq[SalesRow]]])。さらに別の場所では、日ごと、次に国ごとに分類したいと考えています。

Seq[SalesRow]私の質問は、国のマップを行に取り、返す(少量の) ロジックをどこに配置すればよいかということです。今、私はそれをコンパニオン オブジェクト メソッドに入れていますSalesRow.byCountry(rows : Seq[SalesReport]。それは最適ですか?

インスタンス メソッドを持つからSeq[SalesRow]への暗黙的な変換を作成するという、少しクレイジーなアイデアが思い浮かびました。この操作は SalesRows の任意のシーケンスに適用できるため、これは私にとって魅力的です。EnhancedSalesRowSeqbyCountry

これは良い考えですか?

コンパニオン オブジェクトにロジックを追加することは私の最良の選択ですか、それともより良いオプションはありますか?

ありがとう。

4

3 に答える 3

2

ライブラリにはgroupBy関数が付属していることに気付いていない場合。基本的に aを指定すると、関数 fromから に基づいて aSeq[SalesRow]が得られます。Map[T, Seq[SalesRow]]SalesRowT

したがって、関数が簡単な場合は、簡単にマップを取得できます。SalesRowコンパニオンに暗黙的に配置することと組み合わせて、強化された seq のアイデアが気に入っています。

case class SalesRow(val month:Int, val country:String, 
  val person:String, val amount:Float)

class EnhancedRow(rows: Seq[SalesRow]) {
  def byCountry: Map[String, Seq[SalesRow]] = 
    rows.groupBy(_.country)
  def byMonth: Map[Int, Seq[SalesRow]] = 
    rows.groupBy(_.month)
  def byCountryByMonth: Map[String, Map[Int, Seq[SalesRow]]] = byCountry.mapValues(r => new EnhancedRow(rows).byMonth)
}

object SalesRow {
  implicit def toEnhanced(rows: Seq[SalesRow]) = new EnhancedRow(rows) 
}

object Test {
  def main(args:Array[String] = null) {
    val seq: Seq[SalesRow] = // ... fill this
    println(seq.byCountry)
    println(seq.byCountryByMonth)
    // same as:
    println(seq.byCountry.mapValues(_.byMonth))
  }
}
于 2011-05-01T02:26:24.630 に答える
2

パフォーマンスが主な関心事でない場合は、ロジックを次の場所に配置できます。

class RichTraversable[A](t: Traversable[A]) {
  def toMapBy[B](f: A => B): Map[B,A] = t.map{ e => (f(e),e) }.toMap
}

したがって、暗黙的な変換の場合、キーであるメンバーを使用して、すべてSeqを に変換できます。Map

于 2011-04-30T19:29:20.913 に答える
1

カプセル化クラスを作成することをお勧めします。

case class AllSalesTable(rows: Seq[SalesRow]) {
  def toSalesByCountry: SalesByCountry
}

case class ContrySalesTable(rows: Seq[SalesRow])

case class SalesByCountry(map: Map[String, CountrySalesTable])

メソッドを配置する場所があることは 1 つの利点ですが、もう 1 つの利点は、単純な " .rows" をあちこちに配置する代わりに、型の安全性が向上することです。

于 2011-05-01T02:46:34.607 に答える