Как я могу разделить список кортежей scala

У меня есть этот список в Scala (который на самом деле имеет длину 500):

List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))

Что я могу сделать, чтобы создать новый список, содержащий следующее:

List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3))

В основном я хочу иметь новый список кортежей, который будет содержать первый элемент старого кортежа и каждый элемент списка внутри кортежа. Я не уверен, как начать реализовывать это, и поэтому я не опубликовал код, чтобы показать свою попытку. Мне очень жаль, но я не могу этого понять. Я ценю любую помощь, которую вы можете предоставить.


person hispaniccoder    schedule 12.12.2019    source источник


Ответы (3)


Точно так же, как @Andriy, но с использованием для понимания . Что, в конце концов, точно такое же, но ИМХО более читабельно.

val result = for {
  (x, ys) <- xs
  y <- ys
} yield (x, y) // You can also use x -> y

(Опять же, я бы порекомендовал вам следовать любому руководству, это базовое упражнение, с которым, если вы понимаете, как работают map и flatMap, у вас не должно возникнуть никаких проблем)

person Luis Miguel Mejía Suárez    schedule 12.12.2019
comment
Да, ты прав! Я чувствую, что большинство примеров показывают более простые упражнения, чем этот, поэтому я немного сбит с толку, когда мне нужно реализовать что-то более сложное. Спасибо за разъяснение, очень помогло - person hispaniccoder; 12.12.2019

Наверное, стоит упомянуть, что решение Андрея Плохотнюка тоже можно переписать для понимания:

val list = List((1,List(1,2,3)), (2,List(1,2,3)), (3, List(1,2,3)))

val pairs = for {
  (n, nestedList) <- list
  m <- nestedList
} yield (n, m)

assert(pairs == List((1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)))

Компилятор фактически перепишет for-comprehension в цепочку flatMap/map, как описано в другом ответе.

person stefanobaghino    schedule 12.12.2019

person    schedule
comment
@hispaniccoder Вот онлайн-руководства по Scala, FP и популярным библиотекам Scala: scala-exercises.org - person Andriy Plokhotnyuk; 12.12.2019