为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2021-11-17 10:34:27
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 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

你的删除是错误的。想象一下,里面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));
    }


查看完整回答
反对 回复 2021-11-17
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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

您可能希望使用cards.removeAt(0)to(总是)在开始时取出卡,直到达到 limit cutLocation


查看完整回答
反对 回复 2021-11-17
  • 2 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信