2010-04-25 54 views
2

我只是在學習講師給我的幾節課,我無法理解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);} 
     } 
    } 

}

+0

什麼是removeMac引用?至於在這種情況下MAC是什麼 – Woot4Moo 2010-04-25 21:06:46

+0

它是*方法*,而不是*函數*。 Java是OO語言,而不是過程語言。 – BalusC 2010-04-25 21:23:16

回答

3

Java是一個傳遞參考按值面向對象的語言。這些方法可以改變傳入的可變值。

簡單的例子:

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"; 
    } 

} 
+0

+1用於將問題結晶化。 – polygenelubricants 2010-04-26 04:21:47

1

誰說它沒有做任何事情。它修改傳遞的是T []項的值。

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

這些線進行交換索引root和索引childitems兩個條目,的那些。每個heapRebuild()的調用都與同一個items數組一起使用,而不是數組的副本,因此調用者可以看到這些更改。

3

它修改items陣列。

當你傳遞一個對象Java中的功能,它不會使對象的單獨副本。

因此,當您的heapRebuild函數修改items數組時,它會修改傳遞給它的原始數組。

注意,Java不引用傳遞變量,因此,如果函數寫items = whatever,呼叫者的陣列仍然指向舊的陣列實例。

0

該方法正在修改傳入的數組。在Java中,這是通過引用傳入的。更多詳情here

0

該方法改變其T[ ] items參數的內容的順序。在Java中,引用類型(包括數組)的方法參數通過複製引用的值來傳遞。該方法可以使這些引用引用的對象允許進行任何更改。