我在转换元素数量不均匀的列表时遇到了一些麻烦。假设我们的数据是:
ABC
E
GHI
我希望我的清单是:
List(List('A','E','G'), List('B',' ','H'), List('C',' ','I'))
我无法在需要的地方获取空白(' '
)。用我的代码:
val l = List("ABC", "E", "GHI")
println(((l map (_.toArray)) toArray).transpose map (_.toList) toList)
// I get: List(List('A', 'E', 'G'), List('B', 'H'), List('C', 'I'))
一种解决方案可能是获得最长的行,并在其余行中添加空格,但这确实不干净。有一个简单的解决方案吗?
答案 0 :(得分:4)
这是输入列表l
的代码高尔夫球解决方案:
(0 until l.map(_.size).max).map(i => l.map(s => Try(s(i)).getOrElse(' ')))
返回:
Vector(List(A, E, G), List(B, , H), List(C, , I))
此:
Try
用于处理长度比当前正在处理的索引短的项目。这些情况将返回" "
。
要使用Try
,您需要导入:
import scala.util.Try
答案 1 :(得分:2)
一种方法是使用padTo
,尽管这将涉及列表的多次遍历:
val l = List("ABC", "E", "GHI")
val maxSize = l.map(_.size).max // 3
val transposed = l.map(_.toList).map(_.padTo(maxSize, ' ')).transpose
// List[List[Char]] = List(List(A, E, G), List(B, , H), List(C, , I))