何时在列表中使用set和add方法

时间:2018-10-13 23:30:45

标签: java

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()吗?

2 个答案:

答案 0 :(得分:1)

您的删除错误。想象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));
}

答案 1 :(得分:0)

当您在第二个for循环中删除了第一张卡片时,所有卡片都将移到前面一个位置。但是循环变量i仍在增加,您可以在cards.get(i)调用中使用它。这意味着,当您处于循环的第二个迭代中时,将调用cards.get(1),但这将是要删除的原始第三张卡。之后,您尝试使用cards.get(2)删除下一张卡,但是它将删除原始的第五张卡,依此类推。

您可能要使用cards.removeAt(0)(总是)从一开始就取出卡,直到达到限制cutLocation