Получить общий элемент из 2 списков

Итак, у меня есть это 2 collections:

import collection.mutable.ListBuffer

val list1 = ListBuffer[(String, String)]()
list1 += (("Italy", "valid"))
list1 += (("Germany", "not valid"))
list1 += (("USA", "not valid"))
list1 += (("Romania", "valid"))

val list2 = ListBuffer[String]()
list2 += "Germany"
list2 += "USA"
list2 += "Romania"
list2 += "Italy"
list2 += "France"
list2 += "Croatia"

Я хочу получить новый список, который содержит общие страны с конкретными condition например valid так что результатом будет новый список:

Italy, Romania

4 ответа

Когда вам нужно filter а также map в то же время, используйте collect:

list1.collect { case (c, "valid") => c } intersect list2

Используя для понимания следующим образом,

for ((a,"valid") <- list1 if list2.contains(a)) yield a

Это понимание приводит к flatMap и ленивый фильтр. Мы сопоставляем (извлекаем) те кортежи, чей второй элемент соответствуетvalid" и проверьте, принадлежит ли проверенная страна ко второму списку.

Вы можете определить следующий метод:

def intersectWithCond[A, B](xs: Seq[(A, B)], ys: Seq[A])(cond: B => Boolean): Seq[A] = {
  xs.filter(x => cond(x._2)).map(_._1).intersect(ys)
}

Использование:

intersectWithCond(list1, list2)(_ == "valid") // returns ListBuffer(Italy, Romania)

Я думаю, что вы должны отфильтровать, сопоставить, а затем пересечь

list1 filter(_._2=="valid") map(_._1) intersect list2
Другие вопросы по тегам