こんにちは。「Javaを復習する初心者」です。
今日はAPI仕様書でStringクラスを見ていました。接頭辞を判定するというメソッドを見つけました。String#startsWithというメソッドです。
接頭辞を調べる状況は様々だと思いますが一番単純なのは、調べる対象がコード値で先頭一文字のみがある区分を表す場合でしょうか。この場合、charAtを使い、先頭一文字取り出してから判定処理をすればよいと思います。では先頭2文字ならばというと、for文使ってcharAtで・・・という方法もありますが、substringが用意されてます。このメソッドで先頭2文字を取り出すのが一般的でしょう。取り出すべき文字数が固定されている場合、先に文字列を取り出し、判定処理をするという考えで良いと思います。ですが、比較しなくてはならない接頭辞の長さが異なる場合はこの方法だと大変かもしれません。
startsWithは調べる対象の接頭辞の長さが一定でない場合に便利だと思います。startsWithは次の2つが用意されています。
- public boolean startsWith(String prefix)
- public boolean startsWith(String prefix, int toffset)
startsWith(String prefix)
引数一つの方を使ってサンプルを作成しました。ちなみに、startsWith(String prefix) は内部でstartsWith(prefix, 0);をreturnしているのみでした。
以下にフローを書きます。
- String型配列prefixsを以下の値で初期化する。
要素番号 内容 0 “aero” 1 “bio” - String型配列wordsを以下の値で初期化する。
要素番号 内容 0 “aerobics” 1 “biography” 2 “cardiovascular” - 配列wordsの各要素wordに対して以下の処理をする。
- 配列prefixsの各要素prefixに対して以下の処理をする。
- 変数wordの接頭辞が変数prefixに等しい場合、以下を出力する。
“word: ” + word + ” prefix: ” + prefix
- 変数wordの接頭辞が変数prefixに等しい場合、以下を出力する。
- 配列prefixsの各要素prefixに対して以下の処理をする。
以下はソースと実行結果です。
ソース
package stringTest;
public class HelloStartWith {
public static void main(String[] args) {
String[] prefixs = {"aero", "bio"};
String[] words = {"aerobics", "biography", "cardiovascular"};
for (String word : words) {
for (String prefix : prefixs) {
if (word.startsWith(prefix)) {
System.out.println("word: " + word + " prefix: " + prefix);
}
}
}
}
}
結果
word: aerobics prefix: aero
word: biography prefix: bio
最初のループで単語全体を走査して、その中のループで接頭辞全体を操作し、接頭辞を判定しているというサンプルです。接頭辞の長さが一定でない場合はこのような構成のプログラミングになると思います。
startsWith(String prefix, int toffset)
ところで、「startsWith(String prefix, int toffset) 」の方なのですが、toffsetの範囲が限定されてないようです。調べる文字列の長さより大きな値を指定してもfalseを返してくれるようです。以下、実験してみました。
ソース
package stringTest;
public class HelloStartWithOffset {
public static void main(String[] args) {
String str = "ahoge";
String prefix = "hoge";
System.out.println(str.startsWith(prefix, 0));
System.out.println(str.startsWith(prefix, 1));
System.out.println(str.startsWith(prefix, 2));
System.out.println(str.startsWith(prefix, 100));
}
}
結果
false
true
false
false
最後のstartsWithは第2引数がstrの長さより大きいのですが、エラーにならずfalseを返してくれます。
接頭辞を判定するメソッドがあるならば接尾辞の方はどうなのかというと、やはり用意されていて、 endsWithというメソッドがあります。