Scala - 方形Cypher字符串列表

时间:2015-06-23 17:39:06

标签: scala

我正在跟随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以获得我需要的结果,并感谢任何建议或提示。

2 个答案:

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