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に戻すの超めんどい
ちなみに
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の使用が良いと思う。状況に応じてどうぞ