何时在列表中使用 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()吗?


慕森卡
浏览 104回答 2
2回答

摇曳的蔷薇

你的删除是错误的。想象一下,里面cards有五张牌,我们在前两张牌之后将其分开。1&nbsp;2&nbsp;3&nbsp;4&nbsp;5在您的第一个循环终止后,您将得到:1&nbsp;2&nbsp;3&nbsp;4&nbsp;5&nbsp;1&nbsp;2现在,您的第二个循环开始并移除 处的第一张卡片i = 0,即12&nbsp;3&nbsp;4&nbsp;5&nbsp;1&nbsp;2现在,您的第二个循环删除了 处的第一张卡片i = 1,即3,而不是2!这就是你的错误所在。您可以将整个逻辑简化为单个 for 循环:for(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;cutLocation;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;cards.add(cards.remove(0)); &nbsp;&nbsp;&nbsp;&nbsp;}

人到中年有点甜

当您在第二个for循环中取出第一张卡片时,所有卡片都将移到前面一个位置。但是您的循环变量i仍在增加,您可以在cards.get(i)调用中使用它。这意味着当您处于循环的第二次迭代时,您将调用cards.get(1),但这将是要移除的原始第三张卡片。之后,您尝试使用 删除下一张卡片cards.get(2),但它会删除原来的第五张卡片,依此类推。您可能希望使用cards.removeAt(0)to(总是)在开始时取出卡,直到达到 limit&nbsp;cutLocation。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java