ここ最近は、JavaのStringインスタンスを切ってはつなげるコードをひたすら書いてます。1回書いて、見事に失敗。もう1回作り直しているところです。それにしても、これって簡単に書く方法ってないんですかね。
やっぱりパーザもどきを作ろうと思ったら、String→char[]に変換して、ひたすら置換するくらいしかないんだろうか。毎回Stringクラスのsubstringメソッドを呼び出して結合するなんてことをしてたら、かなり面倒だし。いい方法を模索中です。
tetsuの日記・雑記です。不定期に更新します。
tetsuの日記・雑記です。
日々経験したことを記録していきます。
Comments [5]
ぜんさん
やりたい事をもう少し詳しく書いてもらえるとありがたいのですが…。
どんな事をするにしろ、char[]だけは使わない方がいいと思います。
tetsuさん
ある英単語をすべて原形(もしくはそれに準ずる形)に
変換するってことをしてます。たとえば、進行形や過去形を
原形に直すとか、そんな感じです。
char[]を使うとどのあたりが問題になるんですか?
ぜんさん
それはけっこう面倒ですね…。文字列の置換なので、正規表現が使えるString#replaceFirstが割と楽なのではないでしょうか。
とりあえず適当に動詞的なものを集めてきて場当たり的に置換してみましたが、たぶん文法のルールを調べたらもっと簡単に書けるのでしょうね。
final String[] strings = { "derives", "occurs", "moves", "used",
"crosses", "moving", "passing", "intersects", "lowering",
"reaching", "divided", "blocked", "located", "occulting",
"forms", "has", "refracted", "involving", "tilted", "aligned" };
for (final String string : strings) {
System.out.println(string
+ " -> "
+ string.replaceFirst("(ss)es$", "$1").replaceFirst(
"([ertm])s$", "$1").replaceFirst("(ate|se|de)d$",
"$1").replaceFirst("ed$", "").replaceFirst(
"(v)ing$", "$1e").replaceFirst("ing$", "")
.replaceFirst("^has$", "have"));
}
char[]を使わない方がいいと思う理由は
- プログラムが長くなるので可読性が悪くなる
- 1つのオブジェクトを表すのに配列を使うのはおかしい
- 何となく性能が悪くなりそうな気がする
- 文字列処理はStringクラスでできるので、わざわざ自分で書くまでもないのでは…
あたりでしょうか。私の個人的な好みですが。
tetsuさん
なるほど?。確かに正規表現を使えばスマートにプログラムが書けそうですね^^
勉強になりました。
実はこのプログラムは、元になるCのプログラムがあって、それを
Javaに移植する時に起こった問題なのです。元のプログラムでは
char* を駆使して、ひたすらif文で場合分けして書いてあったので
正規表現を使うという点が抜けてました。
こういったプログラムもさらっと書けるようになりたいです(>Д<;)
ぜんさん
あー、そうなんですか。
他人が昔Cで作ったどうしようもないプログラムを移植させられているのなら、凝らずにchar[]でいいんじゃないですかね(笑)オリジナルと同じ動きをするのが一番大事ですから。
だいたい文字列処理はPerlやPHPの得意分野で、あんまりJavaでやるもんじゃないですしね。
コメントする