No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

GroovyのString(Groovy JDK)にいつの間にか#trメソッドが追加されてた

はじめに

もう、追加したんなら言ってよぉ〜(笑)
ということで、v1.7.3から追加されてたみたいです。

前に自分でtrコマンドを書いたりしてたんですが標準サポートされるなんて嬉しい限り。

ということで早速使ってみた。

ソース (動作確認: Groovy Version: 1.7.5 JVM: 1.6.0_20)

tr.groovy
// すべての 'a' を 'A' に変換
assert 'abcabcabc'.tr('a', 'A') == 'AbcAbcAbc'

// a->b, b->a
assert 'abcabcabc'.tr('ab', 'ba') == 'bacbacbac'

// 範囲もいける
assert 'Groovy is so fun!'.tr('a-zA-Z', 'A-Za-z') == 'gROOVY IS SO FUN!'
assert '1234567890'.tr('0-9', '零一二三四五六七八九') == '一二三四五六七八九零'

// シーザ暗号を定義
def caesarCipher = { int shift, String str ->
  def table1 = ('a'..'z').toList()
  def table2 = {
    def temp = table1
    shift.times{ temp = temp.tail() + temp.head() } // シフト回ずらず
    temp
  }()
  str.tr(table1.join(), table2.join())
}

// 3文字ずらすシーザ暗号
def caesar3 = caesarCipher.curry(3)
assert caesar3('abcxyz') == 'defabc'
assert caesar3('fumokmm') == 'ixprnpp'

おわりに

調子に乗ってシーザ暗号まで書いてみました。