我目前有以下代码。我在这一行得到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);
}
最佳答案
查看for
循环以及在其中处理flagcounter
的方式。 for
循环说:
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]
]
假设您正在寻找作家“吉姆·巴彻”。因此,当您进入循环时,您有
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 = 2
和flagcounter = 2
的情况,然后尝试执行dta[3] = dta[2]
,这超出了。正如安息日建议的那样,您需要更正
dta
循环。但是,我认为您可能还缺少一些其他功能,以使其能够执行您想要的操作。除其他外,存在一个事实,即for
不会将dta[flagcounter] = dta[x];
行中的值分配给x
行,而是实际上通过引用将flagcounter
行指向flagcounter
行。关于java - Java数组索引超出范围异常排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11424339/