JAVA初心者です。substringについて教えて下さい。


ある文字列の1文字目から15文字目を取得したいのですが、

下のやりかただとエラーになります。

public class Substr {
public static void main(String[] args) {
String s = "Hello World"; // 文字列sを生成

s = s.substring(0 , 15); // 1文字目から15文字目を取得

// 表示
System.out.println("文字列sの値は " + s + " です。");
}
}

このクラスを実行後に出力されるエラー。
=====
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 15
=====

このエラーを回避するために、下のように15文字以上のときだけ、切り出すという風にしましたが、
変数がたくさんある場合、手間で仕方ありません。

下のようにしないで、15文字より少なくても、エラーにならない方法はないでしょうか?
よろしくお願いします。

public class Substr {
public static void main(String[] args) {
String s = "Hello World"; // 文字列sを生成

if (s.length() > 14){
s = s.substring(0 , 15); // 1文字目から15文字目を取得
}else{
}

// 表示
System.out.println("文字列sの値は " + s + " です。");
}
}

回答の条件
  • 1人10回まで
  • 登録:2007/08/14 00:34:40
  • 終了:2007/08/21 00:35:03

回答(7件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/08/14 00:42:30

ポイント18pt

処理が遅くなるとは思います。

その1もその2も動くと思いますが、

動作確認とれていません。

その2は(String)とかつけないとコンパイルが通らないかも

しれません。

---------------------------------------------------

■その1

String s = "Hello World"; // 文字列sを生成

s = s + " "; //15文字分の空白をつける

s = s.substring(0 , 15);

s = s.trim();

■その2

S= ((s + " ").substring(0 , 15)).trim();

id:kuri6

KUROXさん早速のご回答ありがとうございます。

そこで、再質問ですが、実務で使う場合に、

if (s.length() > 14){

}

のやり方は、一般的でしょうか?(例えば、最大文字数が違う変数が5,6個あったとして、同じようなif文を5,6個書くことはアリなんでしょうか…(プロとして)というのが知りたいです。

2007/08/14 00:48:51
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012007/08/14 01:02:58

ポイント17pt

if (s.length() > 14){

}

のやり方は、一般的でしょうか?

少し前のやりとりですが、参考になるかと思います。

http://q.hatena.ne.jp/1157614003


同じようなif文を5,6個書くことはアリなんでしょうか…(プロとして)

開発の手間を考えて関数化する場合と

速度優先で個別に書く場合とがありますので

アリともナシとも言えます。

関数化しておいて、もしもチューニングが必要になったら

その際に個別に展開するという手もアリです。

id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402007/08/14 01:10:23

ポイント17pt

コメント欄にかけないので、こちらで回答させていただきます。

>実務で使う場合に

ここが難しいところなんですけど(^^;

>同じようなif文を5,6個書くことはアリなんでしょうか

妥当な理由があればOKだと「私」は思います。

elseもわざわざ書かれていますが、コーディングルールで

そう決まっているからですよね(たぶん・・)。

----------------------------------------

私ならというのでかまわないなら、

関数か、文字列操作するクラスを作ります。

cutString関数をコールすることにして

同じ処理は書かないようにします。

sがNULLの時もあると思うので、関数側で何らかの

対処をしたほうがいいとは思います。

このままだと、NULLPointerExceptinになって、

しまいます。

public String cutString(String s,int len){

if (s.length() > len){

   s = s.substring(0 , len);

}else{

//処理なし

}

return s;

}

id:mo81 No.4

mo81回答回数8ベストアンサー獲得回数22007/08/14 02:05:43

ポイント17pt

質問の答えになってないかも知れませんが、

質問者さんのやり方が素直で一般的だと思います。


ただし、変数が多いとき手間になる(似たような処理を何度もやる)なら、

数値を定数に、処理をメソッドにまとめてしまうのがスマートだと思います。


public class Substr {

// 後で変更しやすいよう、15という数値を定数として定義

public final static int SHORT_STRING_LENGTH = 15;


// 再利用しやすいよう、処理をメソッドにまとめる

public static String toShortString(String s) {

if (s.length() >= SHORT_STRING_LENGTH) {

return s.substring(0, SHORT_STRING_LENGTH);

} else {

return s;

}

}


public static void main(String[] args) {

String s1 = "Hello World1"; // 文字列s1を生成

String s2 = "Hello World2"; // 文字列s2を生成


// 定義したメソッドを使って処理

s1 = toShortString(s1);

s2 = toShortString(s2);


// 表示

System.out.println("文字列s1の値は " + s1 + " です。");

System.out.println("文字列s2の値は " + s2 + " です。");

}

}

id:xxxatsxxx No.5

xxxatsxxx回答回数45ベストアンサー獲得回数22007/08/14 04:09:17

ポイント17pt

実務とか一般的ということであれば別のクラスで実装するのが望ましいと思います。ざっくりですので、ほかに実装すべきメソッドはほかにもあります。


実行ファイル>>

package hatena;

import hatena.MyStr;

public class SubStr {

public static void main(String[] args) {

MyStr s = new MyStr("Hello World");

System.out.println(s.mySubstring(0, 15));

}

}


別ファイルMyStr.java>>

package hatena;

public class MyStr {

private String myStrValue;

public MyStr(String arg0){

setValue(arg0);

}

public String getValue() {

return myStrValue;

}

public void setValue(String value) {

myStrValue = value;

}

public String mySubstring(int startIdx ,int endIdx){

System.out.println("開始" + startIdx + "終了" + endIdx);

System.out.println("文字長" + myStrValue.length());

if(myStrValue.length() < endIdx){

return myStrValue.substring(startIdx,myStrValue.length());

}

return myStrValue.substring(startIdx,endIdx);

}

}

id:kuri6

回答者のみなさま

丁寧なご回答ありがとうございます。

それぞれのやりかたを検討していきます。

またコメントします。

2007/08/14 06:24:08
id:yusukey No.6

yusukey回答回数73ベストアンサー獲得回数22007/08/14 09:45:39

ポイント17pt

参考演算子を使う方法もありますね。意味的には if を使うのとあまり変わりありませんが。

s = s.length() >= 15 ? s.substring(0 , 15) : s;

id:eomer No.7

eomer回答回数6ベストアンサー獲得回数02007/08/14 21:33:33

ポイント17pt

たくさんStringを使用する場合は

StringBuffer 使ってみてわ。

Stringだと

メモリが毎回 確保されて

破棄されるまで蓄積してます。

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

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

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

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

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