【问题标题】:Why I cannot use array index decrement when using a another array value in Java?为什么在 Java 中使用另一个数组值时不能使用数组索引递减?
【发布时间】:2020-10-02 06:36:06
【问题描述】:

这是 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];

【问题讨论】:

  • 您遇到了哪个错误?请添加完整的堆栈跟踪。
  • 我已经编辑了错误的问题。
  • Postdecrement 表示在获取值后递减,而不是在执行一行后递减,所以arr[pos--] = arr[pos]; 将是你的单行

标签: java arrays algorithm data-structures insertion-sort


【解决方案1】:

当你想做的时候

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

pos 的值是1 然后它将pos 递减为0,然后在pos 的第二次使用中您将其设为0 - 1

【讨论】:

  • pos-- 减少应该在该行执行之后进行。没有?
  • 应该可以解决它。
  • 我已经插入了 7 13 1 8 3。据我所知,在 i = 2 pos = 2 arr[pos--] = arr[pos-1] 的阶段应该是这样的 arr[2] = arr[1] .更改数组pos-- 的值后应该完成。我错了吗?
  • 你错了。 pos--将在分配arr[pos] = arr[pos-1];之前执行
  • 是的,因为你正在做pos - 1 之前 pos--
【解决方案2】:

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

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

在这里,您将 arr[pos] 中的当前值交换为 arr[pos-1] 中的当前值,因为您在使用之前减少了计数器。之后,pos 值已经在插入 'temp' 值的正确位置

【讨论】:

  • 是的。这是正确的。也适用于arr[pos--] = arr[pos];
【解决方案3】:

我找到了问题所在。代码的一步一步执行就到这里了。

第 9 行:

i == 2pos == 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];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多