почему цикл for может инициализировать переменную, переданную по значению в Java - PullRequest
0 голосов
/ 28 апреля 2018

Код:

 import java.util.Arrays;

class Heapify {
  int[] array;

  Heapify (int[] array){
   this.array = array;
  }


  public  void heap (int[] aArray){
    int left = 0;
    int right  = aArray.length - 1;
    int n = aArray.length;
    int numOfSwap  = 0;    
    heapify1(aArray, left, right, numOfSwap );  
  }  


  public void heapify1 (int[] aArray, int left, int right, int numOfSwap) {
    //from last one that have a child
    for (int i = (right - 1)/2; i > left - 1;  --i){  
      System.out.println("in heapify for loop with i =  " + i + "    number of swap: " + numOfSwap);
      if (aArray[2*i + 2] > aArray[i]) {//if right child is bigger than parent
        System.out.println("in heapify for loop and if #1: " + numOfSwap);
        swap(aArray, i, 2*i + 2, right, numOfSwap);
      }
      else if (aArray[2*i + 1] > aArray[i]){
        System.out.println("in heapify for loop and else if #2: " + numOfSwap);
        swap(aArray, i, 2*i + 1, right, numOfSwap);
      }
    }
  }


  public int swap (int[] aArray, int parent, int child, int right, int numOfSwap ){
    System.out.println("in swap before: " + numOfSwap );
    int temp = aArray[parent];
    aArray[parent] = aArray[child];
    aArray[child] = temp;
    numOfSwap  = numOfSwap  + 1;
    System.out.println("inswap after: " + numOfSwap );
    heapify1 (aArray, parent, right, numOfSwap );
    return numOfSwap;
  }


  public static void main(String args[]) {
    int[] array1 = new int[] {21,15,25,3,5,12,7,45,19,2,9};

    Heapify hs = new Heapify(array1);
    hs.heap(array1);
  }
}

Полученное значение результата было:

in heapify: 0
in heapify for loop with i = 4    number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4    number of swap: 1
in heapify for loop with i = 3    number of swap: 0
in heapify for loop and if #1: 0
in swap before: 0
inswap after: 1
in heapify: 1
in heapify for loop with i = 4    number of swap: 1
in heapify for loop with i = 3    number of swap: 1
in heapify for loop and else if #2: 1
in swap before: 1
inswap after: 2
in heapify: 2
in heapify for loop with i = 4    number of swap: 2
in heapify for loop with i = 3    number of swap: 2
in heapify for loop with i = 2    number of swap: 0
in heapify for loop with i = 1    number of swap: 0
in heapify for loop and else if #2: 0

Я не понимаю, почему swap передал numOfSwap = 1 в heapify1, но в цикле for во второй раз итерации numOfSwap был перезаписан значением 0. Также почему в последнем случае такое поведение перезаписано произошло на 3-й итерации?

Я знаю, что это может быть проблема «передачи по ссылке» или «передачи по значению», но одна вещь, которая действительно меня смущает, это то, что numOfSwap был обновлен с 0 до 1 в swap, swap снова вызывает heapify1, передавая numOfSwap = 1 для успешного heapify1. Но почему numOfSwap инициализируется в цикле for после итераций?

1 Ответ

0 голосов
/ 28 апреля 2018

Существует два вида контекста метода heapify1.

Один - при вызове heapify1(aArray, left, right, numOfSwap ); в heap методе. В этом контексте numOfSwap равно 0 и сохраняет 0. И именно в этом контексте выполняется цикл for. Это может выглядеть как «numOfSwap инициализируется в цикле for после итераций?», Но это не так. Значение никогда не изменяется и сохраняет 0.

Другой контекст - при вызове heapify1 (aArray, parent, right, numOfSwap ); в методе swap, так сказать, «swap вызывает heapify1 снова, передавая numOfSwap = 1 для heapify1 успешно». Но эти переданные значения используются только в этом контексте и не имеют отношения к первому упомянутому контексту, и не изменят значение numOfSwap, равное 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...