1

現在、次のコードがあります。この行で ArrayIndexOutofBoundsException を取得します。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Module3_1_Sort.sort(Module3_1_Sort.java:70)
at Module3_1.s_2d_string(Module3_1.java:155)

対応する行は次のとおりです。

dta[flagcounter] = dta[x];
sortValues = s.sort(sortValues,counter, sortBy, searchterm);

配列の長さを超えていないことは確かです...

誰でも助けることができますか?ありがとう!

プログラムのコードは次のとおりです

    static public void s_2d_string () {
    c.println("2D String Array Program");
    int counter,x;
    c.print("How many entries do you wish to sort? ");
    counter = c.readInt();

    String[][] sortValues = new String[counter+1][2];

    for (x=0;x<counter;x++) {
        c.print("Enter book name: ");
        sortValues[x][0] = c.readLine();
        c.print("Enter book author: ");
        sortValues[x][1] = c.readLine();

    }
    c.print("Which column would you like to sort by? 1 or 2? ");
    int sortBy = c.readInt();
    sortBy = sortBy-1;

    c.print("Enter search term: ");
    String searchterm = c.readLine();

    sortValues = s.sort(sortValues,counter, sortBy, searchterm);

    int flagcounter_int = Integer.parseInt(sortValues[0][0]);

    c.println(flagcounter_int + " results found.");

    for (x=0;x<flagcounter_int;x++) {
        c.println(sortValues[x+1][0] + ", " + sortValues[x+1][1]);
    }
}


static public String[][] sort (String dta[][], int totalNo, int sortBy, String searchterm)  {
    boolean found = false;    
    int flagcounter = 0;
        for (int x=0; x<dta.length;x++) {
            if (sortBy == 0) {
                if (searchterm.equalsIgnoreCase(dta[x][0])) {
                    found = true;
                    flagcounter = flagcounter+1;
                    dta[flagcounter] = dta[x];
                }
            }
            if (sortBy == 1) {
                if (searchterm.equalsIgnoreCase(dta[x][1])) {
                    found = true;
                    flagcounter = flagcounter+1;
                    dta[flagcounter] = dta[x];
                }
            }
        }
    String flagcounter_string = Integer.toString(flagcounter);
    dta[0][0] = flagcounter_string;
    return (dta);
}   
4

2 に答える 2

2

コードを次から変更します

for (int x=0; x<dta.length;x++) {
        if (sortBy == 0) {
            if (searchterm.equalsIgnoreCase(dta[x][0])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
        if (sortBy == 1) {
            if (searchterm.equalsIgnoreCase(dta[x][1])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
    }

for (int x=0; x<totalNo;x++) {
        if (sortBy == 0) {
            if (searchterm.equalsIgnoreCase(dta[x][0])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
        if (sortBy == 1) {
            if (searchterm.equalsIgnoreCase(dta[x][1])) {
                found = true;
                flagcounter = flagcounter+1;
                dta[flagcounter] = dta[x];
            }
        }
    }
于 2012-07-11T01:49:28.843 に答える
2

forループとその中での処理方法を見てくださいflagcounterforループは次のように述べています。

for (int x = 0; x < dta.length; x++)

flagcounterインデックスとして使用される前に、検索語が見つかったときにインクリメントされます。

flagcounter = flagcounter + 1;
dta[flagcounter] = dta[x];

何が起こるかというと、最初の行に一致がある場合、次の行でそれを見つけ続け (それを上書きするため)、最終的に範囲外になります。

例を見てみましょう。これを入力として持っているとします:

Book            Author
-----------------------------
Proven Guilty   Jim Butcher
Naked Sun       Isaac Asimov

したがってdta、次のようになります。

[
    ["Proven Guilty", "Jim Butcher"],
    ["Naked Sun", "Isaac Asimov"],
    [null, null]
]

著者「Jim Butcher」を探しているとします。したがって、ループに入ると、x = 0, flagcounter = 0. すぐに一致が見つかり、何が起こるかは次のとおりです。

flagcounter = flagcounter + 1; // flagcounter is now 1
dta[flagcounter] = dta[x]; // i.e. dta[1] = dta[0];

したがって、dta配列は次のようになります。

[
    ["Proven Guilty", "Jim Butcher"],
    ["Proven Guilty", "Jim Butcher"],
    [null, null]
]

何が起こるかを見ることができます: 前の行を次の行に割り当て続け、最後にx = 2flagcounter = 2を実行しようとするとdta[3] = dta[2]、 の範囲を超えてしまいますdta

forサバスが示唆したように、ループを修正する必要があります。ただし、必要なことを行うには、おそらくもっと何かが欠けていると思います。とりわけ、行の値を行にdta[flagcounter] = dta[x];割り当てないという事実がありますが、実際には行が参照によって行を指すようにします。xflagcounterflagcounterx

于 2012-07-11T01:58:53.933 に答える