Распаковка Scala's List - PullRequest
       13

Распаковка Scala's List

0 голосов
/ 08 апреля 2019

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

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

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


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

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

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

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

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)
//  )
// )
2 голосов
/ 08 апреля 2019

Я точно не знаю, почему вы этого хотите, но попробуйте:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...