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
永远不能小于
最后一个
的长度。我的建议是确保你明白数组索引是以零为基础的,如何进行编码,然后用谷歌搜索更好的算法。