2012-10-20 6 views
0

입니다.사용 FORALL 대신 필터 [A] 주간 게임 결과 보고서에 초과 근무 게임 표시 플래그를 표시할지 여부를 결정하기 위해 노력하고

데이터베이스 게임 결과 테이블은 3 열 (각각 OT를 들어, 더블 OT, 트리플 OT) 잠재적 인 초과 근무 게임 기간 점수 합계를 나타냅니다 (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

하지 내가 제대로 초기 코드를 이해 확실하지만, 여기에 아이디어는 다음과 같습니다

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") 

첫 번째 줄에 단순 목록으로 점수 열을 돌리면 여기에 중요하다. r => Seq(r.p4, r.p5, r.p6)을 나중에 IntSome[Int]을 설정하고 None 없애 버리고 : 당신은 당신이 Seq[Option[Int]]에 매핑 할 수 있습니다 GameResult(p4: Option[Int], p5: Option[Int], p6: Option[Int]) 있습니다. 그러면 Some(42), None, NoneSeq(42)이됩니다.

+1

+1 와우, nonEmpty, awesome에 존재하며, 기본적으로 아무것도 일치하지 않는 패턴을 압축하려면 +10 옵션이 있어야합니다 .-) – virtualeyes

+0

단일 OT에 대해 "Double OT"가됩니다. 그로보고 게임은, 지금 ... – virtualeyes

+0

@virtualeyes : 내 나쁜 변경 : '라벨 (P.SIZE - 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 함수에서 색인을 사용하는 것처럼 보이지 않습니다. 그것은 완전히 제거 될 수 있습니다.

+0

+1, 아, 존재합니다 .zipWithIndex, yah, 컴파일러가 List [Tuple3]에서 전달한 것에 대해 불평하고 zipWithIndex에 List [(Tuple3, Tuple3)]를 사용하는 것이 더 쉽습니다. – virtualeyes