16

私は次のコードを使用しています:

String sample = "::";
String[] splitTime = sample.split(":");
// extra detail omitted
System.out.println("Value 1 :"+splitTime[0]);
System.out.println("Value 2 :"+splitTime[1]);
System.out.println("Value 3 :"+splitTime[2]);

ArrayIndexOutofBound例外が発生しています。String.split()連続または末尾/開始区切り文字をどのように処理しますか?

も参照してください

4

5 に答える 5

25

末尾の空の文字列はデフォルトで破棄されるという Alnitak の指摘は正しいです。

末尾に空の文字列が必要な場合split(String, int)は、パラメーターとして負の数を使用して渡す必要がありlimitます。

パラメータはlimit、パターンが適用される回数を制御するため、結果の配列の長さに影響します。制限nが 0 より大きい場合、パターンは最大n  - 1 回適用され、配列の長さはnを超えず、配列の最後のエントリには、最後に一致した区切り文字を超えるすべての入力が含まれます。nが正でない場合 、パターンは可能な限り何度でも適用され、配列は任意の長さにすることができます。nがゼロの場合、パターンは可能な限り何度でも適用され、配列の長さは任意であり、末尾の空の文字列は破棄されます。

split(aString)は の同義語であることに注意してくださいsplit(aString, 0)

splitこのメソッドは、指定された式とゼロの制限引数を使用して 2 つの引数のメソッドを呼び出すかのように機能します。したがって、後続の空の文字列は、結果の配列には含まれません。

また、ループを使用して配列から値を取得する必要があります。これにより、可能性が回避されますArrayIndexOutOfBoundsException

したがって、修正されたコードは次のようになります(末尾の空の文字列が必要であると仮定します)。

String sample = "::";
String[] splitTime = sample.split(":", -1);
for (int i = 0; i < splitTime.length; i++) {
    System.out.println("Value " + i + " : \"" + splitTime[i] + "\"");
}

出力:

値 0 : ""
値 1 : ""
値 2 : ""
于 2009-04-24T12:23:37.920 に答える
4

J2SE APIマニュアルから:

したがって、後続の空の文字列は、結果の配列には含まれません。

そのため、" " を渡すと、::すべての区切り文字が末尾にあるため、空の配列が得られます。

取得するエントリが 3 つ以下であることを確認したい場合は、次を使用する必要があります

String[] splitTime = sample.split(":", 3);

" " を入力する::と、実際には出力配列に 3 つの空の文字列が返されます。

ただし、入力に " :" が 1 つしかない場合でも、配列には 2 つの要素しか取得できません。

于 2009-04-24T12:20:06.023 に答える
1

たぶんこんな感じ?

int ndx = 0;
StringTokenizer t = new StringTokenizer(": : ::::",":");
while (t.hasMoreElements())
{
    System.out.println(String.format("Value %d : %s", ++ndx,t.nextElement()));
}
于 2009-04-24T12:32:21.300 に答える
0

uが文字列と2番目の引数を区切り文字として渡す関数StringTokenizerを使用します

splittime.length 関数を使用して長さを見つけます

于 2009-04-24T12:19:28.130 に答える
0

splitTime 配列の長さを確認する必要があります。

于 2009-04-24T12:21:16.397 に答える