如何将对本地数组的更改反映到全局数组中?

时间:2016-08-28 07:12:01

标签: java arrays

以下程序是我在互联网上找到的快速排序算法的实现。

public class QuickSort {

    private int array[];
    private int length;

    public void sortElements(int[] arrayvalues) {

        if (arrayvalues == null || arrayvalues.length == 0) {
            return;
        }
        this.array = arrayvalues;
        length = arrayvalues.length;
        doQuickSort(0, length - 1);
    }

    private void doQuickSort(int lowIndex, int highIndex) {

        int i = lowIndex;
        int j = highIndex;

        int pivot = array[lowIndex + (highIndex - lowIndex) / 2];

        // now Divide the array into two arrays(actually we are maintaining single array only)
        while (i <= j) {

            while (array[i] < pivot) {
                i++;

            }
            while (array[j] > pivot) {
                j--;
            }
            if (i <= j) {
                swapElements(i, j);

                //move index to next position on both sides
                i++;
                j--;

            }
        }

        // call quickSort() method recursively
        if (lowIndex < j) {

            doQuickSort(lowIndex, j);
        }
        if (i < highIndex) {

            doQuickSort(i, highIndex);

        }
    }

    private void swapElements(int i, int j) {

        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;

    }

    public static void main(String a[]) {

        QuickSort quicksort = new QuickSort();
        int[] inputarray = {32, 1, 23, 14, 43, 7, 6, 65};

        System.out.println("Before sorting");
        for (int i : inputarray) {
            System.out.print(i);
            System.out.print(" ");
        }

        quicksort.sortElements(inputarray);

        System.out.println("After sorting");
        for (int i : inputarray) {      //Problem line
            System.out.print(i);
            System.out.print(" ");
        }
    }
}

一切都很好,直到最后一个块,排序后打印数组。 for循环再次在inputarray上运行。 inputarray在main中定义,然后传递给sortElements,它被分配给在程序开始时定义的全局数组。所有后续操作都在该全局数组上执行。那么应该在最后一个for循环中打印出来吗?如何对全局数组进行的操作反映在inputarray上?

1 个答案:

答案 0 :(得分:0)

写作时

this.array = arrayvalues;

您实际上并未复制arrayvalues:您只是将this.array指向与arrayvalues指向相同的数组(它们都只是引用)。

因此,当您更改this.array的元素时,您也会更改arrayvalues指向的数组元素,因为它是同一个对象。

如果您真的想要复制arrayvalues,请执行以下操作:

this.array = Arrays.copyOf(arrayvalues, arrayvalues.length);

现在他们指向不同的数组,因此对一个数据的更新不会反映在另一个数组中。

然而,为什么你想要的却不是很清楚:如果你确实需要副本,QuickSort中的更新不是反映在输入数组中:基本上,您无法看到sortElements方法已更改的内容。

因此,我会问你为什么不希望代码以目前的方式工作。