Scala: 如何将各方转换为列表

假设我有以下元组列表:


val tuples = listOfStrings.map/string => {
val split = string.split/":"/
/split/0/, split/1/, split/2//
}/


我想收到 split/0/ 上市 split/1/ 在另一个名单等。
以一种简单的方式,这可以通过写作来实现:


list1 = tuples.map/x => x._1/.toList
list2 = tuples.map/x => x._2/.toList
list3 = tuples.map/x => x._3/.toList


还有更优雅的 /功能/ 在没有写作的情况下实现前述的方式 3 单独的陈述?
已邀请:

帅驴

赞同来自:

这将为您提供作为列表列表的结果:


tuples.map{t => List/t._1, t._2, t._3/}.transpose


如果要将它们保存在本地变量中,请执行以下操作:


val List/l1,l2,l3/ = tuples.map{t => List/t._1, t._2, t._3/}.transpose


UPDATE

: 如..所示 Blaisorblade, 标准库实际上具有内置方法:
unzip3

, 这就像
unzip

, 但是对于三人而不是夫妻:


val /l1, l2, l3/ = tuples.unzip3


毋庸置疑,您必须在上面的手动解决方案前面优先于此方法 /但是对于元组 arity > 3 它仍然会应用/.

小姐请别说爱

赞同来自:

你想要unbutton闪电:


scala> val /numbers, homonyms/ = List//"one", "won"/, /"two", "too"//.unzip
numbers: List[java.lang.String] = List/one, two/
homonyms: List[java.lang.String] = List/won, too/

知食

赞同来自:

如果您需要可用于组合的任意尺寸的东西:


val tupleSize = 3
0.until/tupleSize/.toList
.map/x => /_:Product/.productElement/x/.asInstanceOf[String]/
.map/tuples.map/_//


显然,如果您有一个数组列表,它可能会更优雅。

江南孤鹜

赞同来自:

您可以简单地在一行中写一个语句。

喜欢


/list1, list2, list3/ = tuples.foldRight//List[String]//, List[String]//, List[String]///// /a,b/ => /a._1 :: b._1, a._2 :: b._2, a._3 :: b._3 / /

莫问

赞同来自:

我不了解优雅,但是你

可以

它将在没有元组的中间存储步骤的情况下在一行中完成。 也许这有点难以阅读......


/for/split <- listOfStrings.map/_.split/":"///
yield List/split/0/, split/1/, split/2///.transpose


例子 repl:


scala> listOfStrings
res1: List[java.lang.String] = List/a:b:c, d:e:f, g:h:i/

scala> /for/split <- listOfStrings.map/_.split/":"///
| yield List/split/0/, split/1/, split/2///.transpose
res2: List[List[java.lang.String]] = List/List/a, d, g/, List/b, e, h/, List/c, f, i//

要回复问题请先登录注册