在函数内部更改Java中的对象

时间:2013-01-14 20:02:23

标签: java mergesort

我尝试使用添加的代码为列表实现合并排序。我遇到的问题,我不知道是什么导致它是:如果我直接调用recursiveMergeSort我得到正确的排序列表,但如果我尝试通过调用mergeSort对列表进行排序我只得到第一个列表元件。

I.E如果在主要我有一个列表=“d”,“a”,“f”,“g”,“b”那么

list = recursiveMergeSort(list) // list will be "a","b","d","f","g"
mergeSort(list) // list will be "a"

我需要做些什么才能让mergSort提供与recursiveMergeSort相同的结果?  (公共void函数是在API中给我的,这就是我创建私有递归函数的原因)

public static void mergeSort(List list) {
if (list == null) throw new NullPointerException("list");
    list = recursiveMergeSort(list);
    /* If I check list here, I get the correct result,
    only in the original it's wrong */
}
/** a recursive function for the merge sort  */
private static List recursiveMergeSort(List list) {

    int length = listLength(list);
    System.out.println(length);
    if (length <= 1) { // base case, list length 1
        return list;
    }

    // create sublists
    List left = new List(), right = new List();
    List.Node indexList = list.head;
    left.head = list.head;
    for (int i = 0; i < length / 2 - 1; i++ ) {
        indexList = indexList.getNext();
    }
    right.head = indexList.getNext();
    indexList.setNext(null);

    left = recursiveMergeSort(left); // recursively work on them
    right = recursiveMergeSort(right);
    List tempList = mergeLists(left, right); // final result
    return tempList;
}

(合并列表只是将两个有序列表合并为一个有序列表。)

1 个答案:

答案 0 :(得分:4)

list是一个引用变量,引用List值。

只能通过更改引用它的变量的值来更改引用值。

将您的初始功能更改为:

public static List mergeSort(List list) {
if (list == null) throw new NullPointerException("list");
    return recursiveMergeSort(list);
}

您返回的值将是排序列表。

如果您确实需要更改参数,请尝试:

public static void mergeSort(List list) {
if (list == null) throw new NullPointerException("list");
    List temp = recursiveMergeSort(list);
    list.clear();
    list.addAll(temp);
}

您可以通过调用对象上的方法或更改对象本身或其组件中的字段值来更改对象。 indexList中的recursiveMergeSort是您的起始列表中节点的另一个参考,您正在使用setNext(null)

对其进行更改