这个功能是如何使用的?

时间:2010-04-25 21:01:23

标签: java function

我正在研究我的讲师给我的几个课程,我无法理解函数heapRebuild是如何被使用的!它不会改变任何全局变量,也不会打印任何广告,它不会返回任何内容 - 所以这甚至可以工作吗?不应该,不应该吗?

如果您被告知要使用heapRebuild制作新功能removeMac,您会修改heapRebuild吗?

public class MaxHeap<T extends Comparable<T>> implements Heap<T>{
private T[] heap;
private int lastIndex;

public T removeMax(){
        T rootItem = heap[0];
        heap[0] = heap[lastIndex-1];
        lastIndex--;
        heapRebuild(heap, 0, lastIndex);
        return rootItem;
}

protected void heapRebuild(T[ ] items, int root, int size){

        int child = 2*root+1;
        if( child < size){
            int rightChild = child+1;
            if ((rightChild < size) &&
                    (items[rightChild].compareTo(items[child]) > 0)){
                child = rightChild;
            }
            if (items[root].compareTo(items[child]) < 0){
                T temp = items[root];
                items[root] = items[child];
                items[child] = temp;
                heapRebuild(items, child, size);}
        }
    }

}

6 个答案:

答案 0 :(得分:3)

Java是一种按值传递的OO语言。这些方法可以改变传入的可变值。

简化示例:

import java.util.Arrays;

public class Test {

    public static void main(String... args) {
        String[] strings = new String[] { "foo", "bar" };
        System.out.println(Arrays.toString(strings)); // [foo, bar]
        changeValue(strings);
        System.out.println(Arrays.toString(strings)); // [foo, foo]
    }

    public static void changeValue(String[] strings) {
        strings[1] = "foo";
    }

}

答案 1 :(得分:3)

T temp = items[root];
items[root] = items[child];
items[child] = temp;

这些行交换items中的两个条目,索引root和索引child中的两个条目。 heapRebuild()的每次调用都使用相同的items数组,而不是数组的副本,因此调用者确实可以看到这些更改。

答案 2 :(得分:3)

它修改了items数组。

当您将对象传递给Java中的函数时,它不会创建该对象的单独副本。

因此,当您的heapRebuild函数修改items数组时,它会修改传递给它的原始数组。

请注意,Java不会传递对变量的引用,因此如果函数写入items = whatever,则调用者的数组仍将引用旧的数组实例。

答案 3 :(得分:1)

谁说它什么都没做。它修改传递的值,即T []项。

答案 4 :(得分:0)

该方法正在修改传入的数组。在java中,这是通过引用传递的。更多详情here

答案 5 :(得分:0)

该方法更改其T[ ] items参数内容的顺序。在Java中,通过复制引用的值来传递引用类型(包括数组)的方法参数。该方法可以对引用所引用的对象进行任何更改。