2015-06-23 217 views
0

我正在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以獲得我需要的結果,並希望得到任何建議或提示。

回答

1

這裏是一個不關心等於字長一個版本。應該有更高效的版本,但我想保持相對較短。

基本思路:找出最長單詞的長度(max)。既然你知道,你從索引i = 0開始,並從每個字符串中取出該位置i處的字符,並從中形成一個字符串,直到你在i = max - 1(這是最長字的最後一個字符的位置。不相等的長度,你必須確保你不訪問特點,它是不是有

例:i = 1,那麼你ehellooworldifille得到,但訪問性格1在r會導致一個異常。這就是爲什麼我們事先檢查字符串的大小,並在這種情況下追加空字符串。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)

+0

這真是太好了,非常感謝你花了一些時間來處理這個問題。它當然比我所看到的更好。 – lmcphers

+1

不客氣。雖然在你的例子中這些單詞是按照長度排序的。如果您更改訂單,則結果無法完全讀取。例如:'List(「hello」,「world」,「r」,「fille」)'。它仍然像你想要的那樣工作嗎? – Kigyo

+0

對於我的問題,列表是用長度排序的詞創建的,所以這對我來說不是問題。 – lmcphers

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

+0

您好,感謝您的回答!我唯一的問題是'轉置'要求所有列表具有相同的大小。這並非總是如此(但可以發生)。我編輯了我的原始帖子,以消除這些列表將均勻分區的錯覺。 – lmcphers

+0

我設法使用轉置來編寫方法。這並不漂亮,但它的工作原理。感謝您給我一個正確的方向! – lmcphers

相關問題