【问题标题】:Why is my original array not getting modified when it is used as a method parameter?为什么我的原始数组在用作方法参数时没有被修改?
【发布时间】:2014-11-16 21:59:15
【问题描述】:

所以我有一个 quick_sort 方法,我正在测试如下:

public static void main(String[] args){
  int x[] = {5,4,9,6,3,4,11,99,3,4,5,2,4,7,8,34,5,34543,545,454};
  quick_sort(x,0,x.length-1);
  System.out.println(Arrays.toString(x));
  System.out.println(Arrays.toString(quick_sort(x,0,x.length-1)));
}

这个方法的输出是:

[5, 4, 9, 6, 3, 4, 11, 99, 3,4 ,5 ,2, 4, 7, 8, 34, 5, 34543, 545, 454]

[2、3、3、4、4、4、4、5、5、5、6、7、8、9、11、34、99、454、545、34543]

我的问题是,我认为 java 是按值传递的,而数组是对象。所以我不明白为什么我的两个输出都没有排序。为什么只有第二个,我返回数组的地方,按排序打印出来?当我将 x 传递给函数时,我不应该只收到该指针的副本,该指针仍指向堆中的同一对象吗?因此,我对该数组所做的任何更改都应针对原始指针进行修改。

编辑:

我发现这与 x 是文字这一事实有关。如果我将 x 声明为新的 int[] 并手动填充它,那么两个输出似乎都可以正常工作。

这是我的快速排序:

 public static int[] quick_sort(int arr[], int left, int right) {
if(left==right)
    return arr;
int holdLeft = left;
int holdRight = right;
int partition = left + (right-left)/2;
while(left<right){
    while(arr[left] < arr[partition])
    left++;
    while(arr[right]>arr[partition])
    right--;
    if(left <= right){
    swap(arr,left,right);
    left++;
    right--;
    }
}
if (holdLeft < right)
quick_sort(arr,holdLeft, right);
if (left < holdRight)
quick_sort(arr,left, holdRight);

return arr;
}

【问题讨论】:

  • 请发布您的快速排序代码
  • 我不明白你的问题,你的意思是如果java是按值传递的,它应该全局改变对象的值?好吧,我曾经认为这是传递引用的定义。
  • @muradin java 是按值传递的,但它按值传递指向数组的指针,而不是对象本身。所以这就是为什么它在技术上是按值传递,但实际上基本上是通过引用传递
  • 我无法复制。我两次都收到[2, 3, 4, 4, 3, 4, 6, 4, 5, 5, 7, 5, 9, 8, 11, 34, 99, 454, 545, 34543]

标签: java arrays


【解决方案1】:

您的 quick_sort() 不返回数组。

Java 总是按值传递。困难的事情可能是理解 Java 将对象作为引用传递,并且这些引用被传递 按价值。 (Is Java "pass-by-reference" or "pass-by-value"?)

【讨论】:

  • 我了解对象是如何传递的。我仍然不明白为什么原始数组 x 没有在快速排序中被修改?如果 x 指向一个数组,而我修改了那个数组,为什么它没有被修改?
【解决方案2】:

问题在于,在您的 quick_sort() 方法中,您正在创建另一个数组,并且您将更改存储在该新数组中,并返回该新数组而不是数组 x 或对 x 的引用!!!

【讨论】:

  • no im not :0 快速排序是一种就地排序算法。
  • @user3016349 你能发布你的快速排序代码吗??
  • 检查我的编辑。我觉得这与 x 是数组文字这一事实有关。
  • @user3016349 请同时附上swap()方法的代码:)
【解决方案3】:

您还没有返回快速排序的数组。

如果您声明了int y[] = quick_sort(x, 0, x.length-1);,那么它将起作用,因为您已将排序数组分配给某些东西。目前,您没有将其声明为任何内容。

【讨论】:

  • 我的问题基本上是为什么我需要将它设置为任何东西?为什么我传入的数组没有被修改?既然是对象,不应该在函数内修改吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 1970-01-01
  • 2019-01-09
  • 2022-12-05
  • 2019-07-27
  • 1970-01-01
  • 2016-06-25
相关资源
最近更新 更多