2016-08-04 14 views
2

Ich habe eine Übung in einem Buch gefunden, die etwas Geld in eine ArrayList hinzufügt und sie dann umkehrt. Ich weiß, dass wir einfach Collection.reverse() verwenden können, was mein Lehrbuch zeigt, aber ich fand eine andere coole Lösung online, die ich versuche zu verstehen, aber Probleme damit habe.Eine ArrayList umkehren (Den Code verstehen)

Heres der Code:

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

Hier ist, wo meine Verwirrung ist:

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

Zunächst einmal denke ich, dass ich die Idee, diese zu bekommen. Dies ist jedoch das erste Mal, dass ich das Schlüsselwort Object sehe. Was ich nicht wirklich bekommen, was temp repräsentiert tatsächlich (ich diesen Code ausstieg online, in meinem Buch, das sie dieses Schlüsselwort eingeführt hat Object noch)

Hier sind meine Gedanken auf einem Beispiel Iteration

unsere Arraylist Angenommen hat

[Quarter,Dime,Penny,Nickel] 

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

Wir Quarter die den ersten Platz in der Arraylist nehmen und i den Wert von nickel n dort. So erhalten wir die Arraylist

[Nickel,Dime,Penny,Nickel] 

Jetzt bin ich irgendwie verwirrt .. Als ich system.out.println(temp), es sagt mir, die Werte sind Quarter und Dime. Aber warum? Kann jemand eine Beispieliteration mit mir durchgehen?

AFTER READING ANTWORT

[Quarter,Dime,Penny,Nickel] 

NickelQuarter ersetzt, ist somit Temp Quarter. So fügen wir Quarter bis zum Ende I.E wir

Quarter,Dime,Penny,Quarter 

Warten bekommen .. Aber woher unsere Nickel gehen ?!

Antwort

3

Die Methode set() gibt das Objekt zurück, das vom neuen Objekt verdrängt wird. Die erste Zeile

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

ist die gleiche wie:

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

Man könnte es wirklich tun, ohne die temp Variable in einer Zeile:

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

Ich glaube, ich bekommen, was Sie sagen, aber jetzt bin ich ein bisschen verwirrt, was mit Nickel passiert, können Sie mein sehen hinzugefügt zu meiner Frage bearbeiten? –

+0

@cresjoy Nickel wird erst am Ende in Viertel geändert. Nicht der Anfang. – Arthur

+0

Wie? Wenn temp vierteljährlich ist, wenn wir die Zeile aList.set (ending, temp) erreichen, setzen wir den Endindex, der aktuell Nickel ist, auf temp, der ein Viertel ist. –

0

können die Swap-Methode in übersetzt werden seine "übliche Form":

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

Der gesamte Code, den Sie gefunden haben, kombiniert die ersten beiden Zeilen, da List.set verspricht, den ersetzten Wert zurückzugeben.

Nun wollen wir Ihrem Beispiel sehen, wo aList zunächst [Quarter,Dime,Penny,Nickel] ist, und starting ist 0 und ending3 ist.

  1. Object temp = aList.get(starting);, jetzt ist tempQuarter.
  2. aList.set(starting, aList.get(ending));, jetzt aList ist [Nickel,Dime,Penny,Nickel].
  3. Endlich aList.set(ending, temp); setzt das letzte Element aList zu Quarter: [Nickel,Dime,Penny,Quarter]
+0

Dann haben wir bei der nächsten Iteration nur [Dime, Penny] korrekt? –

+0

Das ist richtig, in der nächsten Iteration wird der Anfang 1 sein und das Ende wird 2 sein. –