Отфильтруйте элементы, сравнив список строк и карту

#scala

Вопрос:

У меня есть две функции, которые получают список строк и карту в качестве параметров и возвращают список целых чисел. Как показано на рисунке:

 def f1(names: List[String], namemap: Map[String, List[Int]]): List[Int] = 

def f2(names: List[String], namemap: Map[String, List[Int]]): List[Int] =
 

Чтобы сделать следующее объяснение более понятным, приведем пример:

 val nameslist = List("alex", "toby")

val namesmap = Map("sarah" -> List(5), "toby" -> List(6), "alex" -> List(1, 6))

println(f1(nameslist, namesmap))
//should print: List(6,1)
println(f2(nameslist, namesmap))
//should print: List(6)
 

Функция f1 должна «сравнивать»? строки из списка namelist со строками с карты namesmap и возвращает все целочисленные значения, из namesmap которых найдена строка.

Функция f2 должна возвращать только целые числа, которые находятся в обеих строках.

Комментарии:

1. Что вы пытались сделать, чтобы решить эту проблему? Можете ли вы дать нам свое частичное решение? Спасибо 🙂

2. Это первый раз, когда я сталкиваюсь с подобной проблемой, и я совершенно не знаю, с чего начать! Есть какие-нибудь советы о том, что мне следует исследовать?

3. Это довольно легко решить, используя map и foldLeft список имен, getOrElse и карту имен; проверьте Scaladoc . Кроме того, вы хотите проверить класс набора 😉

Ответ №1:

Это должно помочь.

 val nameslist = List("alex", "toby", "jo")
val namesmap =
  Map("sarah" -> List(5), "toby" -> List(6), "alex" -> List(1, 6))

nameslist.flatMap(namesmap.get)  //List[List[Int]]
         .flatten                //List[Int]
         .distinct               //duplicates removed
//res0: List[Int] = List(1, 6)

nameslist.flatMap(namesmap.get)       //List[List[Int]]
         .reduceOption(_ intersect _) //Option[List[Int]]
         .getOrElse(Nil)              //List[Int]
//res1: List[Int] = List(6)
 

Комментарии:

1. Это хорошо! Огромное спасибо, приятель! Единственное, когда я пытаюсь f2(List("alex", "jo"),namesmap) , он все равно возвращается List (1,6) , даже если "jo" его не существует в namesmap

2. Я все понял! Спасибо! if (nameslist.map(namesmap.get).forall(_.isDefined)) else List()