高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

二つの授業 並行中

 id:yurliさん、現在JAVAの入門書を買って勉強中。くさばさんの授業と並行で大変そうですね。今回は、くさばさんのほうの授業はString.replaceAllメソッド、教科書に載ってる方はswitch文です。わたしからすると簡単ですが、まあ、それはいわゆる東大生の簡単*1でしょうし。まあ、とりあえず解説をば。

くさばさんの課題(String.replaceAll - id:tomo_k:20050909)

 すべて置き換えの関数、メモ帳などの"すべて置換"とやることは同じなので、かなりイメージは掴みやすいと思います。説明するまでもなく、これはぱぱっと理解できたようですね。
さて、応用して、以下のようなコードならどうなるでしょう?

public class sample1 {

    public static void main(String[] args) throws Exception {
        String a = "a === b";
        a = a.replaceAll("==","!=");
        System.out.println(a);
    }
}

表示されるのはおわかりの通り"a !== b"です。なぜ"a =!= b"とか"a !!= b"になったりしないかというと、文字列検索は常に前方から検索されるから。
だから一番前の==だけが置換され、それ以降はマッチ(match=合う)しないわけです(そのあとに==が残りますが、先頭の=はそのまえに検索した==の一部ですから、マッチの対象には入りません)。
こういう風に並びの決まっていないものを検索するときには、前方から一個ずつ、総当たりで検索するのが一般的です。これを順次検索といいます。まあ、これが一番基本的な検索方法なので、覚えておくと良いでしょう。

教科書にある(?)ほう(switch - id:yurli:20050910#1126312426)

 さて、こっちはswitch文。yurliさんは前回くさばさんに(それとわたしが)言った「breakを使わないほうがよい」というのの影響だと思いますが、break文がありませんね*2
しかし、whileの時とは違って、今回はbreakを使わなければいけません。まあ、一応使わないで、下のcase文を実行するという書き方もあるにはあるのですが、それはフォールスルー*3といい、あまり好ましいやり方ではありません( 事実、C#ではフォールスルーは許されていません*4 )。
ですがくさばさんの言うとおり、JAVAではswitch文はあまり良いものではないようですね。Delphiなどコンパイル言語だと別に変わらないのでしょうが、インタプリタではifより複雑な文、動作速度が遅くなってしまうようです。実際switch自体が存在しない言語もありますし*5「まあ、こんなものもあるんだ」程度で覚えておくというので良いんじゃないでしょうかね?
ついでにC#などは…。バイナリレベルで変わらないと言うことも出来ると思いますが、実際どうなんでしょう?そういえばこの手の文章は読んだことがありません(try{ ... }finally{ ... }とusing(){ ... } は全く同じというのは聞いたことありますが)。

*1:うちの学校ではやっている例えです…(^_^;)まあ、東大生の簡単なことが、一般の人に簡単かというと分からない という意味で

*2:while文の練習の際の話、breakで抜けるのはあくまで例外的なもののため、多用するとソースが見にくくなる。そのため出来れば他の手段で抜けるべき とわたしが言ったのですね

*3:.NETのSDKドキュメントではこう呼ばれています

*4:…とありますが、ケースないに何も命令文がない場合のみ、フォールスルーできるんですよね、これはフォールスルーとはいわないのでしょうか?

*5:Perl5のこと Perl6では文法として追加されるらしい