0

製品と価格のペアを保持する 2 次元オブジェクト配列(Object[][] データ)があります。
これらの値を次の方法で Map に渡そうとします。

private String myPairs = "";
private String[] l, m;

for (int i=0; i<data.length; i++){
    myPairs += (String)data[i][0] + ":" + String.valueOf(data[i][1]) + ",";
}

Map<String, Double> pairs = new java.util.HashMap<>();
l = myPairs.split(",");

for (int i=0; i<l.length; i++){
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}

を取得しjava.lang.ArrayIndexOutOfBoundsExceptionます。私がした悪いことは何ですか?

4

4 に答える 4

2

あなたの問題はここにあります:

pairs.put((String)m[0], Double.parseDouble((String)m[1]));

最初の for ループは、. で終わる文字列を作成します,。たとえば"foo:0.1,bar:0.2,"

次に、 で割ります,。したがって、上記の例は を返し["foo:0.1"; "bar:0.2"; ""]ます。文字列の最後のため、空の文字列値に注意してください,

最後に、各値を で割ります:。最初の 2 つの値 (つまり["foo"; "0.1"]["bar"; "0.2"]) に対しては機能しますが、最後の値は、空の文字列を含む 1 つの値の配列になります: [""]

配列の 2 番目の値 (つまり、1配列は 0 ベースのインデックスであるためインデックス) にアクセスしようとすると、ArrayIndexOutOfBoundsExceptionget がスローされます。


いくつかの解決策:

最初のループで、追加する,かどうかの条件を入力します。

myPairs += (i == 0 ? "" : ",") + (String)data[i][0] + ":" + String.valueOf(data[i][1]);

または最初のループの直後に、文字列の最後の文字を削除します。

myPairs = myPairs.substring(0, myPairs.length() - 1);

または2 番目のループでは、最後の値までではなく、 n-1の値までのみ:

for (int i=0; i<l.length - 1; i++)

または、最初のループで構築している文字列表現が必要ない場合にのみ、すべてのコードを次のように置き換えます。

for (int i=0; i<data.length; i++) {
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1])); 
}
于 2013-01-31T14:33:42.810 に答える
1

sの分割の最後の要素,は空なので (最初のループの最後の反復で言うため+ ",")、2 番目のループの最後の要素をスキップします。

for (int i = 0; i < l.length-1; i++)
{
    m = l[i].split(":");
    pairs.put((String)m[0], Double.parseDouble((String)m[1]));             
}

:また、指定された文字列にs または,s が含まれている場合、アルゴリズムもおそらく例外をスローすることに注意してください。

注 - より良い方法 (および上記を回避する方法) は、次のような最初のループで実行することです。

for (int i = 0; i < data.length; i++)
{
    pairs.put((String)data[i][0], Double.parseDouble((String)data[i][1]));
}
于 2013-01-31T14:33:28.223 に答える
1

最初の for ループが終了すると、すべてのペアが「,」で区切られ、最後に余分な「,」が追加されます。したがって、l.length はペアの数に 1 を加えたものです。ただし、これでエラーが発生することはありません。

問題は、「:」ですべてのペアを分割すると、最後の要素がl空白の文字列に等しくなることです。したがって、分割により、空白文字列を含む 1 要素配列が生成されます。を要求するため、エラーが発生しますm[1]

ペアの最後の要素の後に「,」を追加しないようにしてください。問題は解決するはずです。

これが役立つことを願っています:)

于 2013-01-31T14:33:20.287 に答える