Thinkers'Studio
JavaとC言語の自習ツール
文字列に含まれる空白や改行を除去する自作メソッド

 今回の Tips では、文字列中にある空白文字をすべて除去するメソッドを作ります。
 文字列の空白を削除するメソッドについては、trim を紹介しましたが、trim では文字列の前後にある空白だけが除去され、途中にある空白文字はそのまま残ります。 今回のメソッドでは、途中にある空白も取り去ります

文字列中の空白を除去するメソッド

 ここでは、次のような仕様とします。 文字列から空白を搾り出す( squeeze ) メソッドです。
 public static String squeeze( String s )
 機能 : 文字列sから空白を除去し、戻り値として返す。
         空白の含まれない文字列はそのまま返す。
         全角空白は除去しない。

文字列中の空白を除去する自作メソッドのサンプルプログラム 】
 下のプログラムでは、色々な空白を含んだ文字列/含まない文字列を squeeze した結果を表示します。
class Squeeze {
    public static String squeeze( String s ) {
        StringBuffer buf = new StringBuffer( s.length() );

        //空白以外の文字を取り出す
        for( int i = 0; i < s.length(); i++ ) {
            if( s.charAt(i) == ' '
             || s.charAt(i) == '\n'
             || s.charAt(i) == '\t' ) continue;
            buf.append( s.charAt(i) );
        }
        return buf.toString();
    }

    // ------------------------------------------------------------
    public static void main( String[] args ) {
        String s[] = { " 先頭と中間と 末尾に半角スペース "
                     , " 先頭と中間と 末尾に全角スペース "
                     , "\t先頭と中間と\t末尾にタブ\t"
                     , "\n先頭と中間と\n末尾に改行\n"
                     , "空白の無い文字列"
                     , "      " //半角空白,タブ,改行のみ
                     , "   " //全角空白のみ
                     , ""       //空の文字列
                     };

        for( int i = 0; i < s.length; i++ ) {
            String t = squeeze( s[i] );
            System.out.println( i+":##"+ t +"##");
        }
    }
}

 空白が除去されたか分かるように、## ではさんでプリントします。

(実行結果)
0:##先頭と中間と末尾に半角スペース##
1:## 先頭と中間と 末尾に全角スペース ##
2:##先頭と中間と末尾にタブ##
3:##先頭と中間と末尾に改行##
4:##空白の無い文字列##
5:####
6:##   ##
7:####
・・・ すべての半角スペースが除去された
・・・ 全角スペースは残っている
・・・ すべてのタブが除去された
・・・ すべての改行が除去された
・・・ これはそのまま
・・・ 半角空白のみだったのが、空文字列となった
・・・ 全角空白はそのまま
・・・ 元々空の文字列で、そのまま

処理内容

 String型のままでは内容変更ができないので、StringBuffer型を使って処理しています。
 new StringBuffer( s.length() ) の引数は、初期サイズです。指定したサイズで、まだ文字を持たない文字列バッファが作られます。 指定しなければ初期サイズは16文字分です。StringBuffer は、必要に応じてサイズが増やされますが、適切に取っておくと負荷がかかりません。ここでは s より長くなることはありません。
 s.charAt(i) により i 番目を取り出し、それが空白かどうかを調べています。 空白でなければ buf に append (追加)します。
 最後に String型に変換して結果を返しています。

空白の判定

 空白かどうかを判定するには、Characterクラスに isWhitespace というメソッドがあります。 isWhitespace では全角空白(\u3000)も whitespace とみなします。 一方、trim はそうではありません。上記は trim の取り扱いに合わせて、全角空白は除去しないという仕様にしました。 isWhitespace メソッドを使って判定すると、全角の空白も除去できることになります。その場合、上の例では判定部分を次のようにします。
  if( Character.isWhitespace(s.charAt(i)) ) continue;

(今回のクイズは自習です)
 squeezeメソッドを、上記とは別のやり方で実現するには、どんな方法があるか考えてみましょう。たとえば、trim と他のメソッドを組み合わせたり、パターンマッチのクラスを利用するなど。

[ 関連記事 ] trim を使う

前回のクイズの答え: (前回の問題を見る
たとえば次のように、String prevcode = ""; を、最後に処理した店舗コードを覚える変数として追加します。
while( (s = br.readLine()) != null ) {
    String array[] = s.split( "," ); //カンマで分割
    if( prevcode.equals( array[0] ) ) continue;
    bw.write( array[0] + "\n" )l
    prevcode = array[0];
}
array[0] に入れた店舗コードと prevcode を比較し、同じなら continue して読み飛ばします。異なるときは出力し、prevcode をその店舗コードで更新します。