Previous | Next | Trail Map | Writing Java Programs | String と StringBuffer クラス


その他のアクセス機構メソッド

String クラスについて

前のページで見た length() charAt() の アクセス機構に加えて、 String クラスは指定された文字や文字列の文字列内でのインデックスを返す2つのアクセス機構を提供する。それは indexOf () lastIndexOf() である。 indexOf() メソッドは文字列の最初から前方を検索し、 lastIndexOf() が文字列の終わりから逆順で検索する。

indexOf() lastIndexOf() メソッドは、文字列の部分文字列を返す substring() と共によく使用される。 次のクラスはファイル名の異なる部分を分離するために、 lastIndexOf と substring() を使用する例を示す。
注釈: これらのメソッドはエラーチェックを行わず、それらの引数は完全ディレクトリパスと拡張子つきのファイル名を含むと仮定する。

class Filename {
    String fullpath;
    char pathseparator;

    Filename(String str, char sep) {
        fullpath = str;
        pathseparator = sep;
    }

    String extension() {
        int dot = fullpath.lastIndexOf('.');
        return fullpath.substring(dot + 1);
    }

    String filename() {
        int dot = fullpath.lastIndexOf('.');
        int sep = fullpath.lastIndexOf(pathseparator);
        return fullpath.substring(sep + 1, dot);
    }

    String path() {
        int sep = fullpath.lastIndexOf(pathseparator);
        return fullpath.substring(0, sep);
    }
}

extension() メソッドは、ファイル名でピリオド ('.') の最後の発生場所を見つけるために lastIndexOf() を使用する。 そして substring() はファイル名拡張子、すなわちピリオド ('.') から文字列の最後までの部分文字列を抽出するために lastIndexOf() の返り値を使用する。 このコードは、ファイル名がその中で実際にピリオド ('.') を持っていると仮定してある。ファイル名にピリオド ('.') がないと、 lastIndexOf() は -1 を返し、 substring() メソッドは「文字列インデックスが範囲外の例外」をあげる。

同じく、 extension() substring() に引数として dot + 1 を使用するので注意する。 ピリオド ('.') の文字が文字列の最後であるなら、 dot + 1 の文字は、文字列の中で最も大きいインデックスより1つ大きい文字列の長さに等しい(インデックスが 0 から開始するため)。 しかし、 substring() は文字列の長さに等しい(それより大きくない)インデックスを受け取って、「文字列の終了」を意味するように解釈する。

試してみよう: Filename クラスの他のメソッドを検査し、 lastIndexOf() substring() メソッドがファイル名の異なる部分を切り離すために、どのように互いが作用するか注意すること。

上記の例のメソッドは lastIndexOf() メソッドのひとつのバージョンだけを使用するが、String クラスは実際に indexOf() lastIndexOf() メソッド両方に 4 つの異なるバージョンをサポートしている。

StringBuffer クラスについて

String のように、 StringBuffer は length() charAt() のアクセス機構メソッドを提供している。 これらの2つのアクセス機構に加えて、 StringBuffer にはcapacity()メソッドがある。 capacity() メソッドは、使用されている容量よりも、StringBuffer に現在割り当てられている容量を返すという点で、 length() とは異なる。 例えば、ここで示す reverseIt() メソッドでの StringBuffer の容量は

class ReverseString {
    public static String reverseIt(String source) {
        int i, len = source.length();
        StringBuffer dest = new StringBuffer(len);

        for (i = (len - 1); i >= 0; i--) {
            dest.append(source.charAt(i));
        }
        return dest.toString();
    }
}

StringBuffer の長さがループの繰返し毎に1つ増加するのに対して、決して変わらない。


Previous | Next | Trail Map | Writing Java Programs | String と StringBuffer クラス