Scala 转置大小不均的列表
我在转换元素数量不均匀的列表时遇到了一些问题。假设我们的数据是:Scala 转置大小不均的列表,scala,list,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
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'))
一个解决方案可能是获得最长的一行,并在其余的行中添加空格,但它实际上并不干净。有一个简单的解决方案吗?这里有一个用于输入列表的代码高尔夫解决方案
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
用于处理长度小于正在处理的当前索引的项目。这些案例返回的是“
要使用尝试
,您需要导入:
import scala.util.Try
一种方法是使用,尽管这将涉及列表的多次遍历:
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))
非常感谢你^^您的返回类型是
Seq[List[Any]]
,因为您将Char
元素与String
OrElse混合。另外,试试看
不需要:.toSeq.lift(i).getOrElse(“”)
我确实喜欢你的lift
建议。