我试图确定是否在每周游戏结果报告中显示加时游戏显示标记。
数据库游戏结果表有3列(p4,p5,p6),分别代表潜在的加时游戏时期得分总数(分别为OT,Double OT和Triple OT)。这些列映射到应用程序层中的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
}
其次,确定要显示哪种类型的加班时间,当前忙碌模式匹配(现在看,它似乎不包括所有评分方案),可能以更实用/更简洁的方式完成。
如果你有更好的方法,请随意放下它。
由于
答案 0 :(得分: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)
。
答案 1 :(得分: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
之外,我将传递给过滤器的三个条件组合成一个匿名函数。
此外,我不知道为什么你使用zipWithIndex
时似乎并没有在map
函数中使用索引。它可以完全删除。