Распаковка списка Scala

Итак, моя проблема проста. Я сталкивался с этим много раз, и мой мозг не может найти решение.

Как я могу распаковать список в другой список для неопределенного количества переменных?

Вот что я имею в виду.


val list1 = List(List(7, 4), List(7, 6))

val list2 = List(List(1), List(5), List(8))

val desired_list1 = List(List(1, 7, 4), List(5, 7, 4), List(8, 7, 4))

val desired_list2 = List(List(1, 7, 6), List(5, 7, 6), List(8, 7, 6))

//** The desired_list1 and 2 must be a List[List[Int]] it cannot be List[List[Any]] 

//Here's my attempt, which oddly enough completely ignores all elements of list1(0) which are not the first(7).

val attempt = list2.map(i => i +: list1(0)).map(j => j.collect{ case k:Int => k; case l @ a :: b => a}).map(m => m.map{ case i:Any => i.toString.toInt})

//The result is 

attempt: List[List[Int]] = List(List(1, 7), List(5, 7), List(8, 7))

//while it should be:

val desired_list1 = List(List(1, 7, 4), List(5, 7, 4), List(8, 7, 4))

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


val attempt = list2.map(k => k +: list1(0)).map{ case (k, List(x, y)) => (k, x, y)}

По сути, list1 может иметь любое количество элементов. например

val list1 = List(List(99, 83, 2, 3, 4), List(99, 83, 2, 5 7))

Однако эти числа никогда не повторяются, поэтому я предполагаю, что это тоже может быть набор. Но я мало что знаю о наборах или о том, поможет ли это каким-либо образом.

Разве это не просто val desired_list1 = list2.map(k => k +: list1(0)), второго map не требуется?

Alexey Romanov 08.04.2019 12:26

Нет, потому что тогда это станет List(List(1, List(7, 4)) например

Rucy 08.04.2019 12:41

Нет, не будет, попробуйте: scalafiddle.io/sf/aBvAKMR/1. Конечно, ваше текущее редактирование делает его другим, используйте ++.

Alexey Romanov 08.04.2019 13:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
281
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я точно не знаю, зачем вам это нужно, но попробуйте следующее:

val list1 = List(List(7, 4), List(7, 6))
val list2 = List(1, 5, 8)

list2.flatMap(element=> list1.map(innerList=> element:: innerList))

вывод: Список [Список [Int]] = Список (Список (1, 7, 4), Список (1, 7, 6), Список (5, 7, 4), Список (5, 7, 6), Список ( 8, 7, 4), Список(8, 7, 6))

Estou desenvolver um novo algoritmo para achar как минимальные трансверсали um hypergraph, e isto faz parte do mesmo.

Rucy 08.04.2019 12:22
Ответ принят как подходящий

Кажется, это то, что вы хотите:

val lists: List[List[Int]] = List(List(7, 4), List(7, 6))    
val prefixes: List[List[Int]] = List(List(1), List(5), List(8))

val res: List[List[Int]] = for{
  prefix <- prefixes.flatten
  rest <- lists
} yield prefix :: res

// res: List[List[Int]] = List(List(1, 7, 4), List(1, 7, 6), List(5, 7, 4), List(5, 7, 6), List(8, 7, 4), List(8, 7, 6))

Если вам действительно не нужен список, содержащий ваши desired_list1 и desired_list2 вместе, в этом случае вам нужно:

val res3 = lists.map{ rest => 
  prefixes.flatten.map{prefix =>
    prefix :: rest
  }
}

/// res3: List[List[List[Int]]] =
// List(
//  List(
//      List(1, 7, 4), List(5, 7, 4), List(8, 7, 4)
//  ), 
//  List(
//      List(1, 7, 6), List(5, 7, 6), List(8, 7, 6)
//  )
// )

Спасибо!. Будет ли это работать в распределенном режиме? например, со Spark и RDD?

Rucy 08.04.2019 12:25

Это совершенно другая проблема, и я не уверен, что у меня достаточно данных, чтобы дать вам правильный ответ на нее.

mdm 08.04.2019 12:42

В любом случае спасибо. Я забыл добавить, что на самом деле list2 должен быть: val list2 = List(List(1), List(5), List(8))

Rucy 08.04.2019 12:46

это просто нужно .flatten. Обновил ответ. Если это ответ на ваш вопрос, отметьте его ответом, пожалуйста. Спасибо

mdm 08.04.2019 13:16

Другие вопросы по теме