0

我正在尝试确定是否在每周比赛结果报告中显示加时赛显示标志。

数据库比赛结果表有 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)

除了 using 之外exists,我还将您传递给过滤器的三个条件组合成一个匿名函数。

另外,我不知道您为什么要使用zipWithIndex它,因为之后您似乎没有在map函数中使用索引。它可以完全删除。

于 2012-10-20T18:10:51.290 回答