Scala中如何用foreach循环遍历嵌套列表?
解决Scala嵌套列表遍历的解构错误问题
嘿,我来帮你搞定这个报错!咱们先搞清楚问题出在哪,再一步步解决。
错误原因
你写的val(a,b) = e是元组解构语法,但这里的e是List[String]类型的子列表,Scala没法把列表当成二元组来解构——这俩是完全不同的数据结构。而且你的每个子列表明明有3个元素(比如List("a","b","c")),就算是元组也得是三元组才行呀,所以编译器直接给你报错了。
解决方案
根据你的需求,分两种情况给你方案:
情况1:打印所有嵌套元素(每个单个元素)
如果你的目标是把所有元素都打印出来,不管它属于哪个子列表,最简单的方法是先把嵌套列表“拍平”成一维列表,再遍历:
val totalQuote: List[List[String]] = List(List("a","b","c"),List("1","2","3"),List("d","e","f"),List("4","5","6")) totalQuote.flatten.foreach(println)
或者用嵌套的foreach,逐层遍历子列表和里面的元素:
totalQuote.foreach { subList => subList.foreach(element => println(element)) }
情况2:解构每个子列表的元素(处理单个子列表的内容)
如果你本来就想针对每个子列表的元素做操作(比如打印第一个元素),那得用列表的模式匹配来解构,因为列表不是元组,不能直接用val(a,b)的方式。因为你的子列表都是3个元素,所以可以这么写:
totalQuote.foreach { case List(a, b, c) => println(a) // 这里可以打印a、b、c,或者做你需要的其他操作 }
这里的case List(a,b,c)就是用模式匹配来匹配长度为3的列表,把三个元素分别绑定到a、b、c变量上,这样就能正常使用啦。
如果你的子列表长度可能不一致,还可以用更灵活的模式,比如case head :: tail(取第一个元素和剩余元素),或者case _(匹配任意列表),不过在你的例子里,所有子列表都是3个元素,上面的写法完全够用。
内容的提问来源于stack exchange,提问作者Nespony
相关产品推荐
相关产品推荐

