#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()