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(){ ... } は全く同じというのは聞いたことありますが)。