Page List

Search on the blog

2012年2月4日土曜日

Javaで文字列の変更

Javaのメモ。「Stringで渡された文字列をある条件を満たすように回文にしてStringで返せ」という問題があって、文字列の一部を変更したい場合どうするんだっけ?となったので、いくつかやってみた。
  1. char[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
  2. byte[]に変換して特定の文字を更新、その後Stringオブジェクトに戻す
  3. StringBufferを使う
  4. Stringbuilderを使う
まず、1.のやり方。簡単のため、"hogehoge2011"を"hogehoge2012"にする場合を考えます。
  1. public static void main(String args[]) {  
  2.     String hoge = "hogehoge2011";  
  3.       
  4.     char []chrs = hoge.toCharArray();  
  5.     chrs[chrs.length-1] = '2';  
  6.     hoge = new String(chrs);  
  7.       
  8.     System.out.println(hoge);  
  9. }  


char[]からStringに戻すときは、Stringコンストラクタにchar[]を渡してあげます。

hoge = chrs.toString();
や、
hoge = Arrays.toString(chrs);

を使ってしまいそうになりますが、間違いです。前者は、ObjectクラスのtoString()が呼ばれ「オブジェクトの派生元のクラス名、アットマーク (@)、およびオブジェクトのハッシュコードの符号なし 16 進表現から構成される文字列」を返します。こんなのがhogeに代入されます。

[C@10b30a7

また、後者のArrays.toString(chr)の場合は、以下のような文字列がhogeに代入されます。

[h, o, g, e, h, o, g, e, 2, 0, 1, 2]

ということで、char[]からStringにC++のような代入をしたい場合は、Stringのコンストラクタを使うようです。

2.は1.と同様です。Javaのcharは2バイトの領域を持っています。これに対してbyteは1バイトなので、文字コードが1バイトに収まる文字だけが対象の場合は、byte[]で扱った方が効率的です。

3. StringBufferオブジェクトを利用したやり方です。
  1.     public static void main(String args[]) {  
  2.         String hoge = "hogehoge2011";  
  3.           
  4.         StringBuffer sb = new StringBuffer(hoge);  
  5.         sb.setCharAt(sb.length()-1'2');  
  6.         hoge = sb.toString();  
  7.         System.out.println(hoge);  
  8.     }  

4. StringBuilderを利用したやり方は、StringBufferの場合と同様なので省略します。両者の違いが気になりますが、以下のような違いがあります。
  • 提供する機能は同じ
  • StringBuilderは高速だが、同期を保証しない
  • StringBufferは同期を保証するが、低速
ということで、可能な場合はStringBuilderの使用が推奨されています。

0 件のコメント:

コメントを投稿