我正在跟随Scala的练习来构建一个方形密码。以下是对问题的概述:
List("hello", "world", "fille", "r")
写入String
中每个List
的第一个字母并连接到最终字符串。基本上,如果你用square cypher
形式编写它们,你会得到:
hwfr
eoi
lrl
lll
ode
如果你从上到下,从左到右阅读,那就是信息。我的预期输出必须是List[String]
,变为List("hwfr", "eoi", ...)
。我不知道用什么方法或从哪里开始操作原始List
以便遵守我需要的形式。我不能map zip
,因为zip
只有两个参数而且我有一个不确定的Strings
。我不确定如何迭代此List
以获得我需要的结果,并感谢任何建议或提示。
答案 0 :(得分:2)
scala> val list = List("hello", "world", "fille", "rtext")
list: List[String] = List(hello, world, fille, rtext)
scala> list.transpose
res6: List[List[Char]] = List(List(h, w, f, r), List(e, o, i, t), List(l, r, l, e), List(l, l, l, x), List(o, d, e, t))
诀窍,api
答案 1 :(得分:1)
这是一个不关心相等字长的版本。应该有更高效的版本,但我想保持它相对较短。
基本思路:找出最长单词的长度(max
)。既然你知道这一点,你就从索引i = 0
开始,从每个字符串中取出那个位置i
的字符并从中形成一个字符串,直到你处于i = max - 1
(这是最长单词的最后一个字符。当单词长度不相等时,你必须确保你没有访问不存在的字符。
示例:i = 1
,然后您从e
获得hello
,从o
获得world
,从i
获得fille
,但访问r
上的字符1会导致异常。这就是为什么我们事先检查字符串的大小,在这种情况下追加空字符串。 if(i < elem.size) elem(i) else ""
val list = List("hello", "world", "fille", "r")
val max = list.maxBy(_.size).size //gives you the size of the longest word
val result: List[String] = (0 until max).map(i => list.foldLeft("")
((s, elem) => s + (if(i < elem.size) elem(i) else "")))(collection.breakOut)
println(result) //List(hwfr, eoi, lrl, lll, ode)
编辑:
如果您仍然希望它可以从左右/上下读取(如果它们没有按长度排序而您不想订购它们),则可以引入空格。将if(i < elem.size) elem(i) else ""
更改为if(i < elem.size) elem(i) else " "
。
List("hello", "world", "fille", "r")
将成为List(hwfr, eoi , lrl , lll , ode )
而List("hello", "world", "r", "fille")
将成为List(hwrf, eo i, lr l, ll l, od e)