2012-06-19 4 views
1

모음집이 두 개 있습니다. aclass C의 스칼라 개체 시퀀스입니다. b은 일련의 문자열입니다. C의 문자열 필드는 name이며 b의 항목과 일치 할 수 있습니다. 내가 원하는 것은 a을 반복하고 b의 항목 중 하나와 일치하는 c.name을 모두 찾습니다. 스칼라에서 어떻게해야합니까?스칼라 컬렉션 2 개를 반복하고 일치 항목을 찾습니다.

답변

4

a와 b를 반복하면 값이 커질 수 있습니다. 왜냐하면 다른 루프 안에 중첩 된 하나의 루프가 O (n^2) 시간을 산출하기 때문입니다. b가 충분히 큰 경우, 이것을 먼저 O (n)으로 가져 오기 위해 Set으로 만들고 싶을 것입니다. 내가으로이 글을 읽을 것이다

val bSet = b.toSet; 
a.filter(c => b.contains(c.name)) 

의 "에 다음 필터를 적용 : A의 C 각 항목에 대해, 그것을 포함 결과와 경우에만 C의 이름이 B의 경우."

+0

내 친구는 록 스타입니다! 고맙습니다. – Bob

+2

b가 충분히 큰 경우 먼저 Set으로 설정하려고합니다 (예 : ). bSet = b.toSet; a.filter (c => b.contains (c.name)) –

+0

제안에 감사드립니다. Alex가 먼저 세트로 만들고 왜 충분히 커야할까요? – Bob

1

다음은 yield가있는 루프에 해당합니다.

for(c <- a if b.contains(c.name)) yield c.name 
관련 문제