2014-02-14 59 views
3

我的列表如下所示:List(Person,Invite,Invite,Person,Invite,Person...)。我試圖根據inviteCountRequired進行匹配,這意味着跟在列表中的Person對象之後的Invite對象是可變的。這樣做的最好方法是什麼?我的比賽代碼至今看起來像這樣:scala列表中的計數模式

aList match { 
    case List(Person(_,_,_),Invitee(_,_,_),_*) => ... 
    case _ => ... 
} 

第一個問題,請在我身上輕鬆點。

+1

我不會把它列在一個列表中。使用地圖(人 - > Seq [邀請])或創建一個新的案例類別PI(p:Person,是:Seq [Invite])並具有列表[PI]。 –

+0

感謝Rado。如果我不得不把它保存在一個列表中,並想要一個漂亮的內膽? :) – user2657794

回答

0

感謝您的提示。我結束了創建另一個案例類:

case class BallotInvites(person:Person,invites:List[Any]) 

然後,我從原來的列表填充它:

def constructBallotList(ballots:List[Any]):List[BallotInvites] ={ 

    ballots.zipWithIndex.collect { 
     case (iv:Ballot,i) =>{ 
         BallotInvites(iv, 
          ballots.distinct.takeRight(ballots.distinct.length-(i+1)).takeWhile({ 
          case y:Invitee => true 
          case y:Person =>true 
          case y:Ballot => false}) 
         )} 

    }} 
val l = Ballot.constructBallotList(ballots) 

然後再以數基於inviteCountRequired,我做了以下內容:

val count = l.count(b=>if ((b.invites.count(x => x.isInstanceOf[Person])/contest.inviteCountRequired)>0) true else false) 
0

​​

然後索引的每個位置在列表中,選擇Person情況下,

val persons = (aList zip Stream.from(0)).filter {_._1.isInstanceOf[Person]} 

List((Person(1),0), (Person(2),3), (Person(3),5))。限定然後子列表,其中下限對應於Person實例,

val intervals = persons.map{_._2}.sliding(2,1).toArray 
res31: Array[List[Int]] = Array(List(0, 3), List(3, 5)) 

構建子列表,

val latest = aList.drop(intervals.last.last) // last Person and Invitees not paired 
val associations = intervals.map { case List(pa,pb,_*) => b.slice(pa,pb) } ++ latest 

因此,結果看起來像

Array(List(Person(1), Invite(2), Invite(3)), List(Person(2), Invite(4)), List(Person(3), Invite(6), Invite(7))) 

現在,

associations.map { a => 
    val person = a.take(1) 
    val invitees = a.drop(1) 
    // ... 
} 

這種方法可能被視爲可變尺寸滑動。

0

我不確定我是否理解這個域,但是你只需要迭代一次就可以構建一個person +邀請元組列表。

sealed trait PorI 
case class P(i: Int) extends PorI 
case class I(i: Int) extends PorI 

val l: List[PorI] = List(P(1), I(1), I(1), P(2), I(2), P(3), P(4), I(4)) 

val res = l.foldLeft(List.empty[(P, List[I])])({ case (res, t) => 
    t match { 
    case p @ P(_) => (p, List.empty[I]) :: res 
    case i @ I(_) => { 
     val head :: tail = res 
     (head._1, i :: head._2) :: tail 
    } 
    } 
}) 

res // List((P(4),List(I(4))), (P(3),List()), (P(2),List(I(2))), (P(1),List(I(1), I(1)))) 
+0

應該可能''res匹配{case Nil => res; case head:tail ...''in case'I @ I(_)''將列表以「'I」開頭 – wmmeyer