Java 反转ArrayList(理解代码)

Java 反转ArrayList(理解代码),java,arraylist,Java,Arraylist,我在一本书中找到了一个练习,在ArrayList中添加一些钱,然后将它们反转。我知道我们可以很容易地使用Collection.reverse(),这是我的教科书所展示的,但我在网上找到了另一个很酷的解决方案,我正在尝试理解,但遇到了一些问题 代码如下: class Purse { private ArrayList<String> coins = new ArrayList<String>(); public void addCoin(String co

我在一本书中找到了一个练习,在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);
    }
}
首先,我想我明白了。然而,这是我第一次看到
对象
关键字。我没有真正得到的是
temp
实际代表的内容(我在网上得到了这段代码,在我的书中,他们还没有介绍这个关键字
对象

下面是我对一个迭代示例的想法

假设我们的arrayList

[Quarter,Dime,Penny,Nickel]
根据
objecttemp=aList.set(开始,aList.get(结束))

我们在ArrayList
Quarter
中取第一个点,然后将
nickel
的值放入其中。所以我们得到了ArrayList

[Nickel,Dime,Penny,Nickel]
现在我有点糊涂了。。当我
system.out.println(temp)
时,它告诉我值是
Quarter
Dime
。但是为什么呢?有人能和我一起经历一个示例迭代吗

阅读答案后

[Quarter,Dime,Penny,Nickel]
取代了
季度
,因此温度为
季度
。所以我们在末尾加上四分之一 也就是说,我们得到了

Quarter,Dime,Penny,Quarter
等等。。但是我们的五分钱去哪了

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

交换方法可以转换为“常用形式”:

您找到的所有代码都是合并前两行,因为
List.set
承诺返回替换的值

现在让我们看看您的示例,其中
aList
最初是
[四分之一,一角,一便士,五分]
开始是
0
结束是
3

  • objecttemp=aList.get(开始),现在
    temp
    季度
  • aList.set(开始,aList.get(结束)),现在是
    aList
    [镍币,一角硬币,一便士,镍币]
  • 最后,
    aList.set(ending,temp)
    ,将列表的最后一个元素设置为
    季度
    [镍币、一角硬币、便士、季度]

  • 我想我明白你的意思了,但现在我有点困惑镍会发生什么,你能看到我对我的问题所做的补充吗?@cresjoy nickel最后只被改为四分之一。不是一开始,怎么会?如果当我们到达aList.set(ending,temp)行时temp是季度,我们将结束指数currenrlty Nickel设置为temp,即季度。那么在下一次迭代中,我们只有[Dime,Penny]正确吗?这是正确的,在下一次迭代中,开始是1,结束是2。
    aList.set(ending, aList.set(starting, aList.get(ending)));
    
    Object temp = aList.get(starting);
    aList.set(starting, aList.get(ending));
    aList.set(ending, temp);