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 つの異なるバージョンをサポートしている。
- 指定文字を最初に(最後に)発見した場所のインデックスを返す
- 指定されたインデックスから前方(後方)を検索して、指定文字を最初に(最後に)発見した場所のインデックスを返す
- 指定された String を最初に(最後に)発見した場所のインデックスを返す
- 指定されたインデックスから前方(後方)を検索して、String を最初に(最後に)発見した場所のインデックスを返す
StringBuffer クラスについて
String のように、 StringBuffer はlength()
とcharAt()
のアクセス機構メソッドを提供している。 これらの2つのアクセス機構に加えて、 StringBuffer にはcapacity()
メソッドがある。capacity()
メソッドは、使用されている容量よりも、StringBuffer に現在割り当てられている容量を返すという点で、length()
とは異なる。 例えば、ここで示すreverseIt()
メソッドでの StringBuffer の容量はStringBuffer の長さがループの繰返し毎に1つ増加するのに対して、決して変わらない。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(); } }
String と StringBuffer クラス |