2014-02-11 77 views
2

我真的不明白數組中的賦值如何工作。我正在經歷這一段代碼(使用的方法扭轉數組的值):瞭解數組和值賦值

public static int[] reverseArray2(int[] array) 
    { 
    int i = 0, j = array.length - 1; 
    for (i = 0; i < array.length/2; i++, j--) 
    { 
     int temp = array[i]; 
     array[i] = array[j]; 
     array[j] = temp; 
    } 
    return array; 
    } 

爲什麼,在這種情況下,陣列被現在正確交換? (對於由元素{1,2,3,4,5}組成的數組來說,我們想交換它)。線array[i] = array[j]以哪種方式幫助完成此操作?而且,我如何知道分配給數組的值是? (或者,它們被覆蓋的方式)。我嘗試使用另一種方法,但是我得到了{5,4,3,4,5}作爲輸出。

+1

請張貼您的其他方法。 在'reverseArray2()'中,您將第一個與最後一個交換,第二個與最後一個交換,依此類推。 – Kishore

回答

0

在內存中交換兩個值總是需要第三個值(在這種情況下爲temp)。您將其中一個單元格的當前值設置在一邊(temp = ...),然後覆蓋該單元格之前存儲的內容(a [i] = a [j]),最後將原始單元格值放入其新的spot(a [j] = a [i])。

for循環這裏只是進入陣列的一半的點,從0遞增一個計數器並在該循環從array.length-1

1

基本上遞減另一個每次迭代i從0開始的索引和增量1 ,而j從最後一個數組元素開始,每次迭代減1。

i < length/2條件確保我只去儘可能陣列的中間(這是整數divison所以奇數並不重要(例如:5/2 == 2))

int temp = array[i];保存的值在索引i中的數組在臨時變量中,並且array[i] = array[j]用在j處的值覆蓋i處的值。最後array[j] = temp恢復臨時變量並將其放置在j處。

+0

好吧,我想我終於明白它是如何工作的。我認爲我們遍歷了整個數組,但我們只做到了一半(中間值幾乎沒有變化)。 但是,如果在那些數組值受影響的情況下,當您分配一個數組相等,然後更改一個數組中的值(從而影響另一個數組)時,這些情況大多屬於這種情況? – arcbloom

+0

'x = y'不是平等的,而是賦值。它說'將y值複製到x'。平等是'x == y' – gerrytan

0

允許有一個例子

array={1,2,3,4,5} 

現在在第一,當我們進入循環 我們有

i=0,J=4 

現在,我們有三個線

1)temp =a[i] = a[0] = 1; 所以現在一個存儲到變量temp下的不同存儲位置。

類似地,

2.)a[i] = a[j] =a[4] =5;

這裏5被分配給其中先前1存儲的存儲器位置和該位置是a[0]下。即現在陣列的IST元件已經變爲5

現在,

3.)a[j]=temp=1;

所以現在在位置a[4]陣列的最後一個元素等於1,其是第一元件前面。

最後在下一個循環中temp將被第二個元素初始化並用於交換第二個和第二個最後一個元素。

注:我想現在也很明顯,爲什麼我們將循環運行到實際大小的一半數組。

0

array[i] = array[j]從右到左執行。這意味着array[j]的價值將被放入array[i]

這也意味着,你不能按以下方式寫:

array[i] = array[j] 
array[j] = array[i] 

,因爲它會破壞array[i]值,如果你不把它保存到其他變量,說temp。 所以先保存到tempint temp = array[i]。然後將array[j]的值設置爲array[i]array[i] = array[j]。最後通過array[j] = temparray[i]設置爲array[j]

如果上面的概念是明確的,那麼我們可以模擬下列方式循環:

說,該列表爲{1,2,3,4,5}

  • 我= 0,則j = 4

    1 2 3 4 5 
    ^  ^
    i  j 
    

    現在環路將交換價值和所述陣列中的代碼將看起來像:

    5 2 3 4 1 
    ^  ^
    i  j 
    
  • I = 1,則j = 3

    1 2 3 4 5 
    ^^
        i j 
    

    現在環路將交換價值和所述陣列中的代碼將看起來像:

  • 設爲i = 2,i < array.length/2條件失敗。所以循環退出。

現在你有扭轉名單:{ 5, 4, 3, 2, 1}