微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在Java中使用另一个数组值时不能使用数组索引递减?

如何解决为什么在Java中使用另一个数组值时不能使用数组索引递减?

这是Java中插入排序的简单代码。我尝试减少Java代码的行数。但这不能解决这个问题。我想知道为什么它不能完成。

我尝试过的代码错误发生在第9行)

import java.util.Scanner;

public class InsertionSortModified {
    public static int[] insertionSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int temp = arr[i];
            int pos = i;
            while (pos > 0 && arr[pos-1] > temp)
                arr[pos--] = arr[pos-1];
            arr[pos] = temp;
        }
        return arr;
    }

    public static void main(String args[]) {
        Scanner scnr = new Scanner(system.in);
        int elementarr[] = new int[5];

        for (int j = 0; j < 5; j++)
            elementarr[j] = scnr.nextInt();
        
        elementarr = insertionSort(elementarr);
        for (int j = 0; j < elementarr.length; j++)
            System.out.print(elementarr[j] + " ");
    }
}

命令窗口中显示错误

Exception in thread "main" java.lang.Arrayindexoutofboundsexception: -1
        at InsertionSortModified.insertionSort(InsertionSortModified.java:9)
        at InsertionSortModified.main(InsertionSortModified.java:22)

程序在代码修改为这样时正在运行。 (第8至11行)

            while (pos > 0 && arr[pos-1] > temp) {
                arr[pos] = arr[pos-1];
                pos--;
            }

为什么我不能使用

arr[pos--] = arr[pos-1];

解决方法

当您尝试做

test2

并且arr[pos--] = arr[pos-1]; 的值为pos,然后将1递减为0,然后在pos的第二种用法中,将其设为pos

,

在第9行中,您以错误的顺序减少计数器。正确的行是

`arr[pos] = arr[--pos];`

在这里,您正在使用arr [pos]时将其递减,因为您正在减少计数器。之后,pos值已经在正确的位置以插入“ temp”值

,

我发现了问题所在。在这里逐步执行代码。

第9行:

i == 2时,pos == 2。在第9行,执行顺序是这样的。

  1. 在首次执行时,如果while循环为arr[2] = arr[pos-1]
  2. 定位数组索引2。但是在定位pos之后将减小到pos == 1
  3. 然后一行变成arr[2] = arr[1-1]的意思是arr[2] = arr[0]
  4. 在那之后,while循环仍然是正确的。
  5. 然后在最初的arr[1] = arr[pos-1]处第二次执行while循环。
  6. 然后定位数组索引1。但是在定位pos之后将减小为pos == 0
  7. 然后一行变成arr[1] = arr[0-1]的意思是arr[1] = arr[-1]
  8. 所以这里发生错误。 (ArrayIndexOutOfBounds

正确的代码是这样的。 (第9行)

arr[pos--] = arr[pos];

arr[pos] = arr[--pos];

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。