Java 方法为我提供IndexOutOfBounds异常
我用这个方法得到中值Java 方法为我提供IndexOutOfBounds异常,java,android,indexoutofboundsexception,Java,Android,Indexoutofboundsexception,我用这个方法得到中值 public double getMedian(double[] numberList) { int factor = numberList.length; double[] first = new double[(int) factor / 2]; double[] last = new double[first.length]; double[] middleNumbers = new double[1];
public double getMedian(double[] numberList) {
int factor = numberList.length;
double[] first = new double[(int) factor / 2];
double[] last = new double[first.length];
double[] middleNumbers = new double[1];
for (int i = 0; i < first.length; i++) {
first[i] = numberList[i];
}
for (int i = numberList.length; i >= last.length; i--) {
last[i] = numberList[i];
}
for (int i = 0; i <= numberList.length; i++) {
if (numberList[i] != first[i] || numberList[i] != last[i])
middleNumbers[i] = numberList[i];
}
if (numberList.length % 2 == 0) {
double total = middleNumbers[0] + middleNumbers[1];
return total / 2;
} else {
return middleNumbers[0];
}
}
public double getMedian(double[]numberList){
int factor=numberList.length;
双[]第一个=新的双[(整数)系数/2];
double[]last=新的double[first.length];
double[]middleNumber=新的双精度[1];
for(int i=0;i=last.length;i--){
last[i]=numberList[i];
}
对于(int i=0;i您应该使用i
,而不是i您应该使用i
,而不是i简化答案
如果您只需要,只需在numberList
上使用If-else,就不需要任何子数组:
public double getMedian(double[] numberList) {
int middle = numberList.length / 2;
if (numberList.length % 2 == 0) {
double total = numberList[middle - 1] + numberList[middle]
return total / 2;
} else {
return numberList[middle];
}
}
原始答案
正如我在Zim Zam的回答中所述,该循环也没有使用正确的索引:
for (int i = numberList.length; i >= last.length; i--) {
last[i] = numberList[i];
}
last
只能有0
到numberList.length/2
(向下舍入)。
看起来您需要将两个numberList
拆分为first
和last
,只需使用:
int[] first = Arrays.copyOfRange(numberList, 0, factor);
int[] last = Arrays.copyOfRange(numberList, factor, numberList.length);
代替for循环。简化答案
如果您只需要,只需在numberList
上使用If-else,就不需要任何子数组:
public double getMedian(double[] numberList) {
int middle = numberList.length / 2;
if (numberList.length % 2 == 0) {
double total = numberList[middle - 1] + numberList[middle]
return total / 2;
} else {
return numberList[middle];
}
}
原始答案
正如我在Zim Zam的回答中所述,该循环也没有使用正确的索引:
for (int i = numberList.length; i >= last.length; i--) {
last[i] = numberList[i];
}
last
只能有0
到numberList.length/2
(向下舍入)。
看起来您需要将两个numberList
拆分为first
和last
,只需使用:
int[] first = Arrays.copyOfRange(numberList, 0, factor);
int[] last = Arrays.copyOfRange(numberList, factor, numberList.length);
而不是for循环。你的意思是[0,array.length-1]?@Simon:圆括号表示排除;@jlordo-Huh?在哪个符号中?什么语法?这也会有问题:for(int i=numberList.length;i>=last.length;i--){
我已经为您进行了编辑,因为我认为您的原稿令人困惑,这里的人希望看到编程语言语法。您是不是指[0,array.length-1]?@Simon:圆括号表示排除;)@jlordo-Huh?在哪种符号中?什么语法?这也会有问题:(int i=numberList.length;i>=last.length;i--){
我已经为您进行了编辑,因为我认为您的原稿令人困惑,这里的人们希望看到编程语言语法。首先,在哪一行出现异常?在最后一行[i]=numberList[i];顺便说一句,如果你写了这封信,请原谅我,但这封信太糟糕了!好吧,这条线总是会断的,因为i
永远不能小于last
的长度。我的建议是确保你明白数组索引是以零为基础的,如何编码,并在谷歌上搜索更好的算法。从哪一行开始你得到了例外吗?在最后一行[i]=numberList[i];顺便说一句,如果你写了这封信,请原谅我,但这封信太糟糕了!好吧,这条线总是会断的,因为i
永远不能小于最后一个的长度。我的建议是确保你明白数组索引是以零为基础的,如何进行编码,然后用谷歌搜索更好的算法。