2012-06-19 19 views
1

У меня есть 2 коллекции: a - это последовательность объектов Scala от class C. b - последовательность строк. C имеет поле строки, name, которое могло бы соответствовать товару в b. То, что я хочу, - это пройти через a и найти все c.name, которое соответствует одному из элементов в b. Как мне это сделать в Scala?Scala итерация через 2 коллекции и поиск совпадений

ответ

4

Итерация через a и b может стать дорогостоящей, потому что одна петля, вложенная внутри другой, дает O (n^2) время. Если b достаточно велико, вы, вероятно, захотите сделать его первым в Set, чтобы довести это до O (n).

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

Я прочитал это как «Применить следующий фильтр к: для каждого элемента С в, включить его в результате, если и только если имя с в б.»

+0

Вы, мой друг, рок-звезда! Спасибо, – Bob

+2

Если b достаточно велико, вы, вероятно, захотите сделать его первым, например: val bSet = b.toSet; a.filter (c => b.contains (c.name)) –

+0

Спасибо за предложение, Алекс, но зачем делать его первым и определить достаточно большой. – Bob

1

Вот эквивалент цикла с выходом.

for(c <- a if b.contains(c.name)) yield c.name 
Смежные вопросы