2015-05-05 6 views
1

У меня есть следующие КортежСвести SCALA кортеж с Сетом

(a,b) = (String, Set[String]), и я хочу, чтобы преобразовать его в массив/список (a,b(1)),(a,(b2)) и т.д ..

Я попробовал несколько способов, с flatMap, всегда заканчивается с список b1, b2, но не с кортежем (a, некоторые b).

Благодаря

ответ

2

Другой вариант, просто отображение непосредственно над Set:

scala> val t = ("x", Set("a","b","c")) 

scala> t._2.map((t._1, _)) 

res1: scala.collection.immutable.Set[(java.lang.String, java.lang.String)] 
     = Set((x,a), (x,b), (x,c)) 

В реальном коде, я бы, вероятно, сделать это как следует, чтобы избежать всех _1, _2 уродства, например:

t match {case (a,b) => b.map((a, _))} 

(и добавить a toList в конце любого из них, если вам действительно нужен список, а не набор как ваш окончательный вывод)

1
scala> val (a, b) = ("hello", Set(1, 2, 3)) 
a: String = hello 
b: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

scala> b.to[List].map(e => (a, e)) 
res0: List[(String, Int)] = List((hello,1), (hello,2), (hello,3)) 

Просто помните, что Set не сохраняет порядок.

Edit (использование в преобразованиях):

scala> case class Movie(i: String, g: Set[String], t: String, y: String) 

defined class Movie 

scala> val movies = List(Movie("a", Set("a", "b", "c"), "a", "a"), Movie("b", Set("d", "e", "f"), "b", "b")) 

movies: List[Movie] = List(Movie(a,Set(a, b, c),a,a), Movie(b,Set(d, e, f),b,b)) 

scala> movies.map{case Movie(i, g, t, y) => (t, g.to[List])}.map{case (str, list) => list.map(e => (str, e))} 
res1: List[List[(String, String)]] = List(List((a,a), (a,b), (a,c)), List((b,d), (b,e), (b,f))) 
1

A для понимания обеспечивает аккуратный синтаксис для этого случая; пусть

val (k,s) = ("z", Set("a","b","c")) 

for (v <- s) yield (k,v) 

zipAll Также рассмотреть, как это,

k.zipAll(s,"z","z") 

где строка k рассматривается как последовательность, и мы прокладочные коллекции неодинакового размера с "z".

Смежные вопросы