Scala中遍历嵌套列表问题:生成带递增别名的元素序列
解决方案
你的问题出在把每个子列表的元素直接拼接成了单个字符串,而没有为子列表中的每个元素单独生成带别名的条目。可以通过扁平化遍历嵌套列表的方式解决,同时用更符合Scala风格的函数式写法替代可变变量:
val condkeys = List(List("SITE"), List("SITEID"), List("NAME", "SITEID")) // 用zipWithIndex获取每个子列表的索引,flatMap扁平化所有生成的条目 val allcondkeys = condkeys.zipWithIndex.flatMap { case (subList, index) => val alias = ('b' + index).toChar // 为子列表中的每个元素生成带别名的字符串 subList.map(element => s"$alias.$element") } println(allcondkeys) // 输出: List(b.SITE, c.SITEID, d.NAME, d.SITEID) println(allcondkeys.size) // 输出: 4
关键修改点:
- 用
zipWithIndex关联每个子列表和它的索引,避免手动遍历0到2的硬编码 - 用
flatMap替代普通的map:map会保留子列表的结构,而flatMap会把所有子列表生成的元素合并成一个扁平序列 - 对每个子列表中的单个元素生成带别名的字符串,而不是把整个子列表拼接成一个字符串
如果你坚持要保留原来的循环写法(不推荐,因为Scala更鼓励不可变编程),可以修改为:
val condkeys = List(List("SITE"), List("SITEID"), List("NAME", "SITEID")) var allcondkeys: Seq[String] = Seq.empty for (index <- 0 until condkeys.size) { val alias = ('b' + index).toChar // 遍历当前子列表的每个元素,逐个添加到allcondkeys condkeys(index).foreach { element => allcondkeys = allcondkeys :+ s"$alias.$element" } } println(allcondkeys) // 输出: List(b.SITE, c.SITEID, d.NAME, d.SITEID)
内容的提问来源于stack exchange,提问作者Vikrant Singh Rana
相关产品推荐
相关产品推荐

