2016-08-04 3 views
2

ArrayList에 돈을 더하는 책에서 실습을 발견했습니다. 내 교과서에서 보여주는 것인데 Collection.reverse()을 쉽게 사용할 수 있다는 것을 알고 있지만 이해하기 쉽지만 문제가있는 또 다른 멋진 솔루션을 온라인에서 찾았습니다.ArrayList 반전하기 (코드 이해하기)

을 Heres 코드 : 내 혼란이 어디 여기

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 실제로

여기

내 생각은 예를 들어 반복

우리의 ArrayList를 가정에있는 (그들은 아직이 키워드 Object을 소개 havent 한 내 책 꺼져 온라인이 코드를 가지고) 무엇을 나타내는 지입니다 우리는 ArrayList를 Quarter의 첫 번째 자리를 가지고 nickel의 값을 넣어 Object temp = aList.set(starting,aList.get(ending));

에 따르면

[Quarter,Dime,Penny,Nickel] 

가 나는 거기있어. I system.out.println(temp), 그것은 나에게 말한다 때 그래서 우리는 값이 QuarterDime 있습니다 .. 내가 가지 혼란 스러워요 지금 ArrayList를

[Nickel,Dime,Penny,Nickel] 

를 얻을. 하지만 왜? 누군가가 나와 함께 예제 반복을 할 수 있습니까? 독서의 답변

[Quarter,Dime,Penny,Nickel] 

Nickel AFTER

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

내가 무엇을 당신의 말을 얻을 수 있다고 생각하지만, 지금은 내을 볼 수 있습니다, 니켈 일이 무엇인지에 조금 혼란 스러워요 : 마침내

  • aList.set(ending, temp);Quarter에 aList의 마지막 요소를 설정합니다 내 질문에 편집을 추가 했습니까? –

  • +0

    @cresjoy 니켈은 끝에 4 분의 1로만 변경됩니다. 처음이 아닙니다. – Arthur

    +0

    어떻게? 우리가 aList.set (ending, temp) 행에 도달 할 때 temp가 quarter이면, currenrlty Nickel 인 종료 인덱스를 temp가되는 temp로 설정합니다. –

    0

    그것의 "보통 형식":

    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]입니다. [Nickel,Dime,Penny,Quarter]
    +0

    다음 반복에서 [다임, 페니] 만 정확합니까? –

    +0

    맞습니다. 다음 반복에서 시작은 1이고 끝은 2입니다. –