反转ArrayList(理解代码)

时间:2016-08-04 00:03:55

标签: java arraylist

我在一本书中找到了一个练习,它将一些钱添加到ArrayList中,然后将它们反转。我知道我们可以轻松使用Collection.reverse(),这是我的教科书所显示的内容,但我发现了另一个很酷的在线解决方案,我试图理解但是遇到了麻烦。

下面是代码:

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的值放在那里。所以我们得到了ArrayList

[Nickel,Dime,Penny,Nickel]

现在我有点困惑..当我system.out.println(temp)时,它告诉我价值是QuarterDime。但为什么?有人可以和我一起进行示例迭代吗?

阅读答案后

[Quarter,Dime,Penny,Nickel]

Nickel取代Quarter,因此temp为Quarter。所以我们将Quarter添加到最后 我们得到了

Quarter,Dime,Penny,Quarter

等等..但我们的镍去了哪里?!

2 个答案:

答案 0 :(得分: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)));

答案 1 :(得分: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]
  3. 最后,aList.set(ending, temp);将aList的最后一个元素设置为Quarter[Nickel,Dime,Penny,Quarter]