Scala 使用forall而不是列表[A]上的筛选器

Scala 使用forall而不是列表[A]上的筛选器,scala,filter,pattern-matching,tuples,forall,Scala,Filter,Pattern Matching,Tuples,Forall,我正在尝试确定是否在每周比赛结果报告中显示加班比赛显示标志 数据库游戏结果表有3列(p4、p5、p6),表示可能的加时赛期间总得分(分别针对OT、双OT和三OT)。这些列映射到应用层中的选项[Int] 目前,我正在筛选游戏结果teamA、teamB配对,但实际上我只想知道是否存在任何类型的OT游戏(而不是通过集合进行筛选) def超时显示(a:GameResult,b:GameResult)={ val isOT=!(列表(a,b).filter(wp4.isDefined).filter(wp

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

数据库游戏结果表有3列(p4、p5、p6),表示可能的加时赛期间总得分(分别针对OT、双OT和三OT)。这些列映射到应用层中的选项[Int]

目前,我正在筛选游戏结果teamA、teamB配对,但实际上我只想知道是否存在任何类型的OT游戏(而不是通过集合进行筛选)

def超时显示(a:GameResult,b:GameResult)={
val isOT=!(列表(a,b).filter(wp4.isDefined).filter(wp5.isDefined).filter(wp6.isDefined).isEmpty)
if(isOT){
{List(((a.p4,a.p5,a.p6),(b.p4,b.p5,b.p6)).zipWithIndex.map{
案例(((一些(u),无,无),(一些(u),无,无)),i)=>“OT”
案例((一些(uu),一些(u),无,(一些(u),一些(u),无)),i)=>“双OT”
case((一些(u),一些(u),一些(u)),(一些(u),一些(u),一些(u)),i)=>“三重OT”
}}
}
else scala.xml.NodeSeq.Empty
}
其次,确定要显示哪种类型的加班,当前繁忙模式匹配(现在看,它似乎没有涵盖所有评分场景),可能可以以更功能/简洁的方式完成

如果你有更好的方法,请随意放下它


谢谢

我不确定我是否正确理解了初始代码,但这里有一个想法:

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
,并去掉
non/code>。这将把
Some(42),None,None
变成
Seq(42)

看看这个:

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
函数中使用索引。它可以被完全移除。

+1,啊,存在,我明白了。重新;zipWithIndex,是的,编译器抱怨在列表[Tuple3]中传递的纯zip更容易在zipWithIndex上列出[(Tuple3,Tuple3)]。+1wow,甚至更好,存在于NoneEmpty,awesome上,并且,为了将模式匹配压缩到基本上没有,应该有+10选项;-)@virtualeyes:my bad,更改为:
labels(p.size-1)
对,已经这样做了,并且得到了一个索引越界异常。可能是我这边的数据集,需要验证。这里还需要一个if(isOT),否则每个游戏都显示为OT,而不是case;-)@虚拟用户:对,
p
的大小可以是
0
3
之间的任何值,但是如果排除空(
if(isOT)
),一切都应该正常。对不起,我说我没有完全理解这个领域。不用担心,你已经做的是非常令人难以置信的。我将List()、List(0)、List(1)和List(1,1)视为if(isOT)的结果,因此数据集可能有问题(假设if“results.exists(u.nonEmpty)”返回true时不可能出现空列表)
List(a, b).exists(x => x.p4.isDefined && x.p5.isDefined && x.p6.isDefined)