Scalaで文字列を1つずつずらす

やりたいこと

文字列のアルファベットをaddだけずらす(a->b->cのように)ことをしたい。abcdzをadd=1でずらすとbcdeaになる、みたいな感じ。

Scalaで書いてみた

らこうなった。

new String (
  str.toLowerCase(Locale.ENGLISH).map{ it =>
    (it - 'a' + add) % ('z' - 'a' + 1) + 'a'
  }.map(_.toChar).toArray
)

気に入らない

ただこれ個人的に気に入ってなくて、特に問題なのは

  • なんか文字をズラす部分ダサい
  • charのcollectionをstringに戻すの超めんどい

という点で、多分ぽんこつさんのScala力が足りてない所為な気がするんだけどどうすればいいんだろ。

ちなみに

Javaのstring.toLowerCaseがLocaleに依存するらしい。これは想像も付かないような罠

修正

下のコメントを参考にして書き換えてみた。

def add(n: Int)(c: Char): Char = ((c - 'a' + n) % ('z' - 'a' + 1) + 'a' ).toChar

str.toLowerCase(Locale.ENGLISH).map(add(n))

こんなとこかな。個人的にはそこそこ満足したのでこれで良し。

キモとなる部分は、

  • mapにCharからCharに変換する関数渡せば、Stringが戻ってくる

という点。まーもし一回分離して戻すようなコードである必要がある場合は、xuweiさんが指摘していたようにmkStringの使用が良いと思う。状況に応じてどうぞ