繁体   English   中英

使用递归返回void方法

[英]Return a void method using recursion

我正在尝试对字符串数组实现快速排序,但是我不知道如何从void方法返回字符串数组。 PS:以防万一,我想告诉您所有其他方法(例如交换和分区)已经实现,并且我认为您无需查看它们。 不能选择使用任何第三方帮助程序库。

public static String[] quicksort(String[] a)
{
    int low = 0;
    int high = a.length;
    quicksort_lomuto(a, low, high);
    return a; //<-- Here is the problem!!! What am I supposed to return?
}
public static void quicksort_lomuto(String[] a, int i, int j)
{
    if(j-i < 2) return;
    int k = partition_lomuto(a, i, j);
    quicksort_lomuto(a, i, k);
    quicksort_lomuto(a, k+1, j);
}

如果必须有一个void返回值,则可以简单地更改数组的内容。 虽然数组参数已按值传递,但“值”本质上是指向数组的指针,而不是数组的全部内容。 一个例子:

 public static void main(String[] args) {
    String[] arr = new String[]{ "foo", "bar" };
    changeMyArray(arr);
    System.out.println(arr[0] + "," + arr[1]); // output is: foo,baz
 }

 private static void changeMyArray(String[] myArray) {
     myArray[1] = "baz";
 }

如果将array参数设置为某种值( a = mumble ),则从方法返回时不会反映出来。 但是,如果将数组的内容设置为某些内容( a[i] = mumble ),它将成功。

您可能不希望更改输入数组。 在这种情况下,您可以使用“输出参数”实现相同的解决方案。

public static void quicksort_lomuto(String[] inputArray, int i, int j, String[] outputArray)
{
    if (outputArray == null)
    {
        throw new IllegalArgumentException("outputArray cannot be null");
    }
    if (outputArray.length != inputarray.length)
    {
        throw new IllegalArgumentException(
            "outputArray must be the same length as inputArray");
    }
    /* sort inputArray, putting values into outputArray */
}

如果您决定不返回任何新值,那么操作这些值以使新的排列在块外可以到达的唯一方法是重新排列传递给该函数的对象的内部内容。

例如,我可以实施

sort(int[] values)

用一个看起来像块的功能

if (values[x] > values[y]) {
   int temp = values[x];
   values[x] = values[y];
   values[y] = temp;
}
...

现在,方法完成后,通过参数列表传递的数组将有所不同。

这是一种很差的编程风格/实践; 但是,在极少数情况下,不希望移动集合或生成新的数据集合是必要的。 在计算机科学中,这些情况确实很少见,但确实存在于TB级的数据集中。

还要注意,这样的技术可以允许在两个同时执行的调用中处理相同的数据,因此,如果您不使用单线程解决方案,则需要对数据进行分区并(以自己的方式)防止破坏性的并发访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM