2016-08-04 111 views
2

我在一本書中發現了一個練習,它在ArrayList中添加了一些資金,然後將它們逆轉。我知道我們可以很容易地使用Collection.reverse(),這是我的教科書顯示的內容,但是我發現了另一個很酷的解決方案,我在嘗試理解但遇到問題。顛倒ArrayList(瞭解代碼)

繼承人的代碼:

class Purse { 
    private ArrayList<String> coins = new ArrayList<String>(); 

    public void addCoin(String coinName) { 
     coins.add(coinName); 
    } 

    public void reverse() { 
     for(int start = 0, end = coins.size() - 1; start < coins.size()/2; start++, end--) { 
      swap(start,end,coins); 
     } 
    } 

    private void swap(int starting, int ending, List aList) { 
     Object temp = aList.set(starting, aList.get(ending)); 
     aList.set(ending,temp); 
    } 

    public String toString() { 
     return "Purse: " + coins; 
    } 

} 

public class PurseDemo { 
    public static void main(String [] args) { 
     Purse purseObj = new Purse(); 
     purseObj.addCoin("Quarter"); 
     purseObj.addCoin("Dime"); 
     purseObj.addCoin("Penny"); 
     purseObj.addCoin("Nickel"); 
     System.out.println(purseObj); 
     purseObj.reverse(); 
     System.out.println(purseObj); 
    } 
} 

這裏就是我的困惑是:

所有的
Object temp = aList.set(starting,aList.get(ending)); 
aList.set(ending,temp); 

首先,我覺得我得到的這個想法。不過,這是我第一次看到Object關鍵字。我真的不明白是什麼temp實際上代表(我得到這個代碼從網上,在我看來他們還沒有推出該關鍵字Object還)

這裏有一個例子迭代

假設我們的ArrayList中我的想法有

[Quarter,Dime,Penny,Nickel] 

根據Object temp = aList.set(starting,aList.get(ending));

我們採取ArrayList中Quarter的第一地點與放nickel i的值在那裏。因此,我們得到的ArrayList

[Nickel,Dime,Penny,Nickel] 

現在我有點糊塗。當我system.out.println(temp),它告訴我的值是QuarterDime。但爲什麼?有人可以通過與我的例子迭代?

之後讀ANSWER

[Quarter,Dime,Penny,Nickel] 

Nickel取代Quarter,從而溫度是Quarter。因此,我們添加季度到年底 即我們得到

Quarter,Dime,Penny,Quarter 

等待。但在哪裏我們去鎳?

回答

3

set()方法返回被新對象移動的對象。第一行

Object temp = aList.set(starting,aList.get(ending)); 

是一樣的:

Object temp = aList.get(starting); 
aList.set(starting, aList.get(ending)); 

其實你可以做到這一點沒有temp變量,在一行:

aList.set(ending, aList.set(starting, aList.get(ending))); 
+0

我覺得我得到了你的說法,但現在我有點困惑,什麼與鎳發生,你可以看到我添加編輯到我的問題? –

+0

@cresjoy鎳只在最後變成四分之一。不是開始。 – Arthur

+0

如何?如果temp到達aline.set(ending,temp)時的四分之一,我們將結束索引設置爲currenrlty Nickel,temp爲四分之一。 –

0

Swap方法可以翻譯成其「通常形式」:

Object temp = aList.get(starting); 
aList.set(starting, aList.get(ending)); 
aList.set(ending, temp); 

您找到的所有代碼都會合並前兩行,因爲List.set會承諾返回替換的值。

現在讓我們看看你的榜樣,其中aList最初是[Quarter,Dime,Penny,Nickel],並starting0ending3

  1. Object temp = aList.get(starting);,現在tempQuarter
  2. aList.set(starting, aList.get(ending));,現在aList[Nickel,Dime,Penny,Nickel]
  3. 最後,aList.set(ending, temp);,設置ALIST到Quarter最後一個元素:[Nickel,Dime,Penny,Quarter]
+0

然後在下一次迭代中,我們只有[Dime,Penny]是否正確? –

+0

這是正確的,在下一次迭代中,開始將是1,結束將是2。 –