2011-07-27 6 views
0

는 첫 번째 요소는 i 일치 어디 두 목록 임의의 크기의 튜플은

val L1 = List[(Int, Int)]((1,1), (2,2)) 
val L2 = List[(Int, Int, Int)]((1,1,1), (2,2,2)) 

지금 내가 int 값 i에서받는 함수 func을 만들고 싶어

모두 목록에서 모든 항목을 말해봐 . 편도는

def func(i:Int) = { 
    L1.collect.collect{case any if any._1 != i => any} 
    L2.collect.collect{case any if any._1 != i => any} 
} 

두 줄이 너무 비슷하다고 생각하면 코드를 짧게 만들면 좋을 것입니다. 나는 func에 대한 매개 변수로 L1 (및 L2)을 전달할 수있는 방법을 썼습니다. 이 함수는 튜플에 포함될 요소의 수를 미리 알지 못한다. 첫 번째 요소는 Int이다.

이것이 가능합니까?

[편집 : 질문이 충분히 명확하지 않았다고 생각합니다. 내 사과.]

내가 원한다. 두 개 이상의리스트에서 이것을 수행하고 싶습니다. 예를 들어, n에 대해, 각리스트에 대해 한 번, func을 여러 번 호출합니다. 각 L1L2는 ... Ln 먼저 소자 Int

[EDIT2] 상기에서

, L1 될 수리스트 (Int, String)의로 튜플리스트이다

L1 = L1.collect.collect{case any if any._1 != i => any} 
    L2 = L2.collect.collect{case any if any._1 != i => any} 
    ... 
    Ln = Ln.collect.collect{case any if any._1 != i => any} 

, L2 때문일 수 (Int, Int, Int) 등입니다. 유일한 보증은 첫 번째 요소가 Int입니다.

답변

6
def func(i:Int, lst: List[Product]) = { 
    lst.filter(_.productElement(0) == i) 
    } 

& 댄의 코멘트 위의 편집에 따라 편집.

+0

감사합니다. 나는 'productIterator'를 알지 못했다. 내 문제를 해결하는 것 같습니다. 이 목록은 튜플을 사용하여 무언가를 수행하는 예제를 제공했습니다 (더 나은 튜플이없는 경우). 튜플을 일반적인 방법으로 처리하는 방법을 알아야했습니다. – Jus12

+0

내가하고 싶은 일은 가능하다고 생각하지 않지만 튜플을 처리하는 일반적인 방법 인 것 같습니다. 내가 원하는 것은 L1, L2 등을 재 할당하는 것입니다. – Jus12

+0

@ Jus12 목록을'val'보다는'var's로 정의 할 수 있습니다. 그런 다음'L1 = func (i, L1)'등을 사용하십시오. 필요 –

2

모든 Tuple 당신이 불확실한 크기의 튜플을 처리하는 방법으로 제품의 반복자를 사용할 수 있도록 (또는, 참으로, 어떤 경우 클래스)하는 Product입니다 : 제품으로

val x = (1,1,1,1) 
x.productIterator forall {_ == 1} //returns true 

를위한 공통의 슈퍼 타입입니다 두 목록의 요소는, 당신은 단순히 그들과 필터를 연결할 수 있습니다 :

val list1 = List((1,1), (2,2)) 
val list2 = List((1,1,1), (2,2,2)) 

(list1 ::: list2) filter {_.productIterator forall {_ == 1}} 
//returns List[Product with Serializable] = List((1,1), (1,1,1)) 

UPDATE를

,

이 포함 된 제품의 첫 번째 요소에 단지 하나의 목록을 필터링하려면

val list1 = List((1,1), (2,2)) 
list1 filter {_.productIterator.next() == 1} 
+1

그러면 모든 튜플 요소가 'i'와 같은 목록이 반환 될 것입니다. OP가 튜플의 첫 번째 항목이'i '이고 다른 요소가 무엇이든간에 튜플을 원한다고 생각합니다.이 경우 제품을 사용할 수 있습니다. productElement (0) : 임의의 Tuple에 대한 첫 번째 항목을 가져옵니다. –

+0

각 튜플에 대해'x.productIterator.next == 1'을 할 수 있다고 생각합니다. – Jus12

관련 문제