java に関する質問です。


substring を利用して文字列の抜き出しを行っているのですが、

test = "0123456789";
substring( test ,11,12);

以上の処理を行うと当然エラーがでますが、文字がない場合に test に A という文字を入れたい場合はどうしたらいいでしょうか?

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:2006/09/07 16:26:45
  • 終了:2006/09/14 16:30:04

回答(8件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/09/07 16:42:23

ポイント17pt

例文は、

test.substring(11,12);

の間違いですよね?


文字が無い場合というのが何をあらわしているのかがよく分からないのですが、

test = "A";

ということでしょうか?

id:zachouR

ああ!すいません、間違えました!

その通りです。test.substring(11,12);

の間違いです。

文字がないというのは、例えば文字列の切り出しを行った場合に、指定した場所に文字がなかった場合(testに入っているのは10文字だけなので)、なにか別の文字をtestに入れる事ができたらいいな、と思ったので質問してみました。

2006/09/07 16:48:37
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/09/07 16:50:40

ポイント17pt

if (test.length >9) {

test ="A";

}else{

test.substring(11,12);

}

こんな感じになりますね。

id:zachouR

ありがとうございます。

文字数を調べてやる方法も試してみます。javaは、このあたりは厳しそうですね、、、。

2006/09/07 16:57:18
id:sight No.3

sight回答回数69ベストアンサー獲得回数12006/09/07 16:54:30

ポイント16pt

ええっと、こういうことでしょうか?

public class Test {

public static void main(String argv[]){

String test = "0123456789";

try{

System.out.println(test.substring(11,12));

}

catch(java.lang.StringIndexOutOfBoundsException e){

test = "A";

}

System.out.println(test);

}

}


Stringオブジェクトのsubstringで開始・終了インデックスの範囲外だった場合はIndexOutOfBoundsExceptionが発生されるので、それをひろって好きな処理をすればいいのでは?

id:zachouR

ありがとうございます!

やはり、try catch が最適みたいですね。

助かりました。早速試してみます。

2006/09/07 16:58:22
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402006/09/07 17:12:42

ポイント16pt

Exception を拾うのが確実ではありますが、Java は Exception の発生がコストが高いこととあくまで「例外」であることから、

if による分岐が適当と思います。

基本は2番の方と同じなのですが、条件判定が違っているようなので。

あと、substring 関数は元のString を変更しません。

if (test.length >= 11) {
  test = test.substring(11,12);
}else{
  test = "A";
}
id:zachouR

ありがとうございます、これは安全そうですね!

文字数を数える方がやはり安全っぽいですね、、、。

2006/09/08 09:55:25
id:hive7134 No.5

hive7134回答回数167ベストアンサー獲得回数162006/09/07 17:23:05

ポイント16pt

try-catchは最適ではありません。

http://www.nextindex.net/java/perform/tips.html

(ロジック分岐のための例外処理 参照)

やはり文字数を事前に調べる必要があるのではないでしょうか?

三項演算子を用いれば多少すっきりさせることが可能です。

String test = "0123456789";
int beginIndex = 11;
int endIndex = 12;

test = test.length() >= endIndex ? test.substring(beginIndex,endIndex) : "A";
id:zachouR

ありがとうございます。これはすっきりしていて、すぐに使えそうです!

助かります!

2006/09/08 09:56:38
id:yyok No.6

yyok回答回数59ベストアンサー獲得回数32006/09/07 18:00:47

ポイント16pt

ちなみにsubstringの開始位置は相対位置(先頭が0)になるので、

substring(11,12)と書くと12文字目を切り出そうとします。

try catchはオーバーヘッドが大きいのでむやみに使うべきでない、と本で読んだことがあります。

よって最初の方の回答、lengthチェックをするのが良いのではないでしょうか。

sta_posを切り出し位置の絶対指定(先頭なら1)とすると、

if (test.length < sta_pos)

  {

    test ="A";

  }

else

  {

    test.substring(sta_pos - 1, sta_pos);

  }

でどうでしょう。

id:zachouR

ありがとうございます!

try catch はなるべく使用しないようにして、やってみたいと思います。

エラーを利用する、という事みたいなので、やはりさけた方が無難なんですね。

2006/09/08 09:58:23
id:sight No.7

sight回答回数69ベストアンサー獲得回数12006/09/08 10:37:06

ポイント16pt

#3です。

すみません。例外扱いしたいのだと思い込んでいました。

substringを決まった桁でかけている以上、対象文字列は日付等の固定長のデータで、

その一部を切り出したい、といった用途を想定しました。

異常値が入ってきた場合、その識別のために"A"を入れようとしているのかと思ったので、try-catchを書きました。

(ですので、catchで"A"を入れるというよりは、識別できたあとの処理を想定。)

ようは、何を意図して、何を想定して作るかだと思うのですが、あたりまえに11,12桁目がないデータが入ってくるのでしたら、私も横着をしないで条件分岐をすることをオススメします。

そうでなく、11,12桁目がないのは想定外のデータで、異常状態として扱いたいのなら、コストがかかってもExceptionを拾った分かりやすいのではないかと思います。

この判断は、そのまんま、条件分岐をしたいのか、異常処理をしたいのか、に尽きますね。

id:zachouR

ご解答ありがとうございました!

条件分岐を利用する事にしました、もちろん念のためにtryも利用します(^^)

2006/09/13 10:10:34
id:koichiarchi No.8

koichiarchi回答回数3ベストアンサー獲得回数02006/09/08 20:06:04

ポイント16pt

恐らく文字数不明、指定桁数不明の状態でとの意味だと思いましたので以下のようになるかと思います。

String test = "0123456789"; 	// 対象文字列
int target = 11;		// 抽出対象桁(1以降指定)

if (test.length() < target) {
    test = "A";
} else {
    test = test.substring(target - 1, target);
}

いくつかご提案なさっているコードではコンパイルが通らなかったり、桁数によって例外が発生したりかと思いますので、念の為投稿させて頂きました。

id:zachouR

ありがとうございます!

短いソースで実際に利用できそうです!

ありがとうございます!!

2006/09/13 10:11:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません