0

毎週の試合結果レポートに延長戦の試合表示フラグを表示するかどうかを決定しようとしています。

データベースゲームの結果テーブルには、延長戦の可能性のあるゲーム期間のスコアの合計(それぞれ、OT、ダブルOT、トリプルOT)を表す3つの列(p4、p5、p6)があります。これらの列は、アプリケーション層のOption[Int]にマップされます。

現在、ゲーム結果のteamA、teamBのペアをフィルタリングしていますが、実際には、OTゲームが何らかの種類で存在するかどうかを知りたいだけです(コレクションをステップスルーするのではありません)。

def overtimeDisplay(a: GameResult, b: GameResult) = {
  val isOT = !(List(a,b).filter(_.p4.isDefined).filter(_.p5.isDefined).filter(_.p6.isDefined).isEmpty)
  if(isOT) {
    <b class="b red">
    {List( ((a.p4,a.p5,a.p6),(b.p4,b.p5,b.p6)) ).zipWithIndex.map{
      case( ((Some(_),None,None), (Some(_),None,None)), i)=> "OT"
      case( ((Some(_),Some(_),None), (Some(_),Some(_),None )), i)=> "Double OT"
      case( ((Some(_),Some(_),Some(_)), (Some(_),Some(_),Some(_) )), i)=> "Triple OT"
    }}
    </b>
  }
  else scala.xml.NodeSeq.Empty
}

第二に、どのタイプの残業を表示するか、現在その忙しいパターンマッチ(今それを見ると、すべてのスコアリングシナリオをカバーしているようには見えない)の決定は、おそらくより機能的/簡潔な方法で行うことができます。

より良い方法があれば、気軽に置いてください。

ありがとう

4

2 に答える 2

4

最初のコードを正しく理解しているかどうかはわかりませんが、次のアイデアがあります。

val results = List(a, b).map(r => Seq(r.p4, r.p5, r.p6).flatten)
val isOT = results.exists(_.nonEmpty)
val labels = IndexedSeq("", "Double ", "Triple ")
results.map(p => labels(p.size - 1) + "OT")

ここでは、スコア列を最初の行のフラットリストに変えることが重要です。あなたはGameResult(p4: Option[Int], p5: Option[Int], p6: Option[Int])あなたがマップすることができるものを持っていますSeq[Option[Int]]r => Seq(r.p4, r.p5, r.p6)そして後で平らにしてに向けSome[Int]Intそして取り除くことができますNone。これはに変わりSome(42), None, NoneますSeq(42)

于 2012-10-20T18:07:24.160 に答える
3

これを見て:

val isOT = !(List(a,b).filter(_.p4.isDefined).filter(_.p5.isDefined).filter(_.p6.isDefined).isEmpty)

existsこれは、の代わりにを使用して書き換えることができますfilter。私はそれを次のように書き直します:

List(a, b).exists(x => x.p4.isDefined && x.p5.isDefined && x.p6.isDefined)

を使用することに加えてexists、フィルターに渡した3つの条件を1つの無名関数に結合しています。

また、後で関数zipWithIndexでインデックスを使用しているように見えないのに、なぜ使用しているのかわかりません。map完全に削除できます。

于 2012-10-20T18:10:51.290 に答える