首页 > 解决方案 > 何时在列表中使用 set 和 add 方法

问题描述

cutDeck()洗牌的最后一步——切牌。这应该从卡片中移动第一cutLocation张卡片(“第一”表示最低索引处)并将它们添加到列表的后面。确保您以与它们最初存储的相同(相对)顺序添加卡片。

public List<PlayingCard> cutDeck(int cutLocation) {
    for (int i = 0; i < cutLocation; i++) {
        cards.add(cards.get(i));
    }
    for (int i = 0; i < cutLocation; i++) {
        cards.remove(cards.get(i));
    }
    return cards;
}

这是我收到的错误消息

当卡片有 208 张卡片时,cutDeck(133) 没有正确剪切。在索引 0 处,预期为 5H,但预期为 3C:<[5H]> 但为:<[3C]>

我看不出我做错了什么,是我的逻辑应该使用cards.set()而不是cards.add()吗?

标签: java

解决方案


你的删除是错误的。想象一下cards其中有五张牌,我们在前两张牌之后将其拆分。

1 2 3 4 5

在您的第一个循环终止后,您将获得:

1 2 3 4 5 1 2

现在,您的第二个循环开始并移除 处的第一张卡片i = 0,即1

2 3 4 5 1 2

现在,您的第二个循环删除了 处的第一张卡i = 1,即3,而不是2

这就是你的错误所在。您可以将整个逻辑简化为一个 for 循环:

for(int i = 0; i < cutLocation; i++) {
    cards.add(cards.remove(0));
}

推荐阅读