文字列内に出現するすべての空白文字を"%20"に置き換えるメソッドを考えます。
しかし、以下の文章の文意がイマイチ読み取れません。
解答例もあるのですが、その解答例も不明な点が幾つかあるのです。
「文字列内に出現するすべての空白文字を"%20"で置き換えるメソッドを書いてください。ただし、文字列の後ろにはあたらに文字を追加するためのスペースが十分にある(バッファのサイズは気にしなくても良い)ことと、その追加用スペースを除いた文字列の真の長さが与えられます。
(注意)Javaで実装する場合は、追加の領域を使用せずに処理できるように文字配列を使ってください。
例
入力:"Mr John Smith "
出力;”Mr%20John%20Smith"
」
(解答)
文字列操作においてよく使用されるアプローチとして、文字列の最後尾から先頭に向かって編集する方法があります。この方法ではバッファの後ろに追加のバッファを加えることができるので、便利ですし、編集時に文字列を上書きしてしまう心配もありません。
では、実際にこのアプローチを使ってみましょう。2回の走査を行います。最初の走査では空白文字の数を数えます。これにより、返還後の文字列の長さを計算することができます。次の操作で逆順に、実際の置き換え処理を行います。空白文字があれば次の場所に「%20」という文字列をコピーします。もし空白文字でなければ、そのままコピーします。
Java
1public void replaceSpaces(char[] str, int length) { 2 int spaceCount =0,newLength,i=0; 3 //スペースの数を数える 4 for(i =0;i<length;i++) { 5 if(str[i] ==' ') { 6 spaceCount++; 7 } 8 } 9 //変換後の文字列の長さを算出 10 newLength = length + spaceCount*2; 11 12 str[newLength] = '\0'; 13 14 //逆順で置き換え処理 15 for(i = length - 1;i >= 0;i--) { 16 if(str[i] == ' '){ 17 18 str[newLength - 1] = '0'; 19 str[newLength - 2] = '2'; 20 str[newLength - 3] = '%'; 21 newLength = newLength - 3; 22 } else { 23 str[newLength - 1] = str[i]; 24 newLength = newLength -1; 25 } 26 }
「文字列の後ろにはあたらに文字を追加するためのスペースが十分にある(バッファのサイズは気にしなくても良い)こと」
これの意味は
"a b " -> "a%20b"
と変換されるときに、元々の文字列よりも返還後の文字列が必ず大きくなるから、本来ならそのことを考慮しないといけないけれど、今回は考えなくていいですよ。
ということだと思うのですが、他の言語(C言語等)で実装する場合はこのようなことを考慮しないといけないのでしょうか?
また、バッファという言葉の意味がつかめていません。
返還後の文字列の容量のことなのでしょうか?
そして、これも他の言語だと気にする必要があるのでしょうか?
以上が文意についての質問でした。
続いて、コードについてです。
このコードの戻り値をvoidにして、staticをつけて、以下のように呼び出してみました。
Java
1public static void main(String[] args) { 2 String initialString = "a b c"; 3 char[] chars = initialString.toCharArray(); 4 String after = replaceSpaces(chars,5); 5 System.out.println(after); 6 }
結果は予想どおりArrayIndexOutOfBoundsExceptionが出ました。
最初に渡す配列サイズよりも大きいインデックスにアクセスしようとしているためです。
この本は「いかに良いコードを書くか」という点にもフォーカスしているのですが、このコードってエクセレントなのでしょうか。
私が理解できないだけなのかと思い質問いたしました。
質問が多く、申し訳ないですが、お答え頂ければ嬉しいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/08/22 14:12