假设我有一个函数fn
,它接受以下形式的元组:
fn(
"a" -> (
"b" -> "k",
"c" -> 293,
"d" ->(
"e" -> Seq("i", "j"),
"f" -> Seq(1, 2)
)
),
"g" -> (
"h" -> true
)
)
我不知道如何实现fn
能够遍历每一片叶子(" b"," c",&#34 ; e"," f"最后" h")每次知道叶子自己的父母。
无形似乎是一种解决方案,即使我不知道如何实现它。
注意:首选香草scala方法(如果可能的话)。
注意:我知道我有一个Tuple2(String, T)
,其中T可以是另一个元组(String,T),一个字符串,一个数字,一个布尔值或一个Seq [V]。
注意:Seq [V]其中V可以是字符串,数字或布尔值。
答案 0 :(得分:1)
我不确定你是什么意思"每次知道叶子自己的父母",但你应该能够调整它来做你需要的事情:
def traverseLeaves(p: Product)(visitor: (String,Any) => Unit):Unit = p match {
case (parent:String, child:Seq[_]) => visitor(parent, child)
case (_:String, child: Product) => traverseLeaves(child)(visitor)
case (parent:String, child) => visitor(parent, child)
case _ => p.productIterator.foreach {
case child:Product => traverseLeaves(child)(visitor)
case _ => ???
}
}
注意,如果它在任何地方找到超过两个元素的元组,包含除元组之外的任何其他元素,则会抛出异常,因为从您的问题中不清楚在这种情况下您打算做什么。如果您想以不同方式处理它,请将???
更改为将处理该情况的逻辑。