Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何展平嵌套元组?_Scala_Tuples_Flatten - Fatal编程技术网

Scala 如何展平嵌套元组?

Scala 如何展平嵌套元组?,scala,tuples,flatten,Scala,Tuples,Flatten,我有一个嵌套的元组结构,比如(String,(String,Double)),我想把它转换成(String,String,Double)。我有各种各样的嵌套元组,我不想手动转换它们。有什么方便的方法吗?元组上没有扁平化。但如果你知道结构,你可以这样做: implicit def flatten1[A, B, C](t: ((A, B), C)): (A, B, C) = (t._1._1, t._1._2, t._2) implicit def flatten2[A, B, C](t: (A,

我有一个嵌套的元组结构,比如
(String,(String,Double))
,我想把它转换成
(String,String,Double)
。我有各种各样的嵌套元组,我不想手动转换它们。有什么方便的方法吗?

元组上没有扁平化。但如果你知道结构,你可以这样做:

implicit def flatten1[A, B, C](t: ((A, B), C)): (A, B, C) = (t._1._1, t._1._2, t._2)
implicit def flatten2[A, B, C](t: (A, (B, C))): (A, B, C) = (t._1, t._2._1, t._2._2)
这将使用任何类型展平Tuple。还可以将隐式关键字添加到定义中。这只适用于三个元素。可以按如下方式展平Tuple:

(1, ("hello", 42.0))   => (1, "hello", 42.0)
(("test", 3.7f), "hi") => ("test", 3.7f, "hi")
无法将多个嵌套元组展平到地面,因为返回类型中只有三个元素:

((1, (2, 3)),4)        => (1, (2, 3), 4)

如果您使用,我想这正是您所需要的。

不确定这是否有效,但您可以使用
Tuple.productIterator.toList
Tuple
转换为
List
,然后
展平嵌套列表:

scala> val tuple = ("top", ("nested", 42.0))
tuple: (String, (String, Double)) = (top,(nested,42.0))

scala> tuple.productIterator.map({
     |   case (item: Product) => item.productIterator.toList
     |   case (item: Any) => List(item)
     | }).toList.flatten
res0: List[Any] = List(top, nested, 42.0)

在我看来,简单的模式匹配是可行的

scala> val motto = (("dog", "food"), "tastes good")
val motto: ((String, String), String) = ((dog,food),tastes good)

scala> motto match {
     | case ((it, really), does) => (it, really, does)
     | }
val res0: (String, String, String) = (dog,food,tastes good)
或者,如果您有此类元组的集合:

scala> val motto = List(
     | (("dog", "food"), "tastes good")) :+ (("cat", "food"), "tastes bad")
val motto: List[((String, String), String)] = List(((dog,food),tastes good), ((cat,food),tastes bad))

scala> motto.map {
     | case ((one, two), three) => (one, two, three)
     | }
val res2: List[(String, String, String)] = List((dog,food,tastes good), (cat,food,tastes bad))
我想即使你们有几个箱子也很方便。

补充

粘贴此实用程序代码:

import shapeless._
import ops.tuple.FlatMapper
import syntax.std.tuple._
trait LowPriorityFlatten extends Poly1 {
  implicit def default[T] = at[T](Tuple1(_))
}
object flatten extends LowPriorityFlatten {
  implicit def caseTuple[P <: Product](implicit lfm: Lazy[FlatMapper[P, flatten.type]]) =
    at[P](lfm.value(_))
}
scala> val a = flatten(((1,2),((3,4),(5,(6,(7,8))))))
a: (Int, Int, Int, Int, Int, Int, Int, Int) = (1,2,3,4,5,6,7,8)

请注意,此解决方案不适用于自定义的
案例类
类型,该类将在输出中转换为
字符串

scala> val b = flatten(((Cat("c"), Dog("d")), Cat("c")))
b: (String, String, String) = (c,d,c)

你应该放一些代码示例。仅链接的答案不会跟随stackoverflowguidelines@Juh_参见代码示例