2010-04-25 3 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

+0

Это * методы *, а не * функции *. Java - это язык OO, а не процедурный язык. – BalusC

ответ

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

1

Кто сказал, что он ничего не делает. Он изменяет переданное значение, которое является T [].

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

Эти строки поменять местами две записи в items, те, по индексу root и указательным child. Каждое обращение heapRebuild() работает с тем же массивом items, а не с копиями массива, поэтому эти изменения действительно просматриваются вызывающим.

3

Он изменяет массив items.

Когда вы передаете объект функции в Java, он не создает отдельную копию объекта.

Поэтому, когда ваша функция heapRebuild изменяет массив items, он изменяет исходный массив, который был передан ему.

Обратите внимание, что Java не передает ссылки на переменные, так что если функция написала items = whatever, массив вызывающего будет по-прежнему ссылаться на старый экземпляр массива.

0

Метод модифицирует переданный массив. В java это передается по ссылке. Подробнее here.

0

Метод изменяет порядок содержимого своего параметра T[ ] items. в Java параметры метода ссылочного типа (включая массивы) передаются путем копирования значения ссылки. Метод может делать любые изменения, разрешенные объектами, на которые ссылаются ссылки.

Смежные вопросы