转置大小不等的列表

时间:2018-07-09 14:45:09

标签: scala list

我在转换元素数量不均匀的列表时遇到了一些麻烦。假设我们的数据是:

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'))

一种解决方案可能是获得最长的行,并在其余行中添加空格,但这确实不干净。有一个简单的解决方案吗?

2 个答案:

答案 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))

此:

  • 检索输入列表中字符串的最大长度。
  • 从0循环到输入列表中字符串的最大长度
  • 在每个循环中,它在给定的索引处获取每个元素的字符。

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))