You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java开发Set卡牌游戏时如何解决队列中出现重复卡牌的问题

问题原因

Java中LinkedHashSet等基于哈希表实现的集合,判断对象重复依赖两个方法:hashCode()和equals()。你当前的Cards类没有重写这两个方法,默认使用Object类的原生实现:

  • 原生hashCode()根据对象内存地址生成哈希值
  • 原生equals()直接比较两个对象的内存地址是否相同
    因此哪怕两个Cards实例的四个属性完全一致,只要是分别new出来的不同对象,也会被LinkedHashSet判定为非重复对象,导致去重逻辑失效。
解决方法

步骤1:给Cards类新增equals和hashCode重写实现

在你现有的Cards类代码中,新增以下两个方法即可(需要引入java.util.Objects工具类):

import java.util.Objects;

public class Cards {
    // 原有属性、构造方法、getter、setter、toString均保留,只新增下面两个方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cards cards = (Cards) o;
        return number == cards.number 
                && Objects.equals(color, cards.color) 
                && Objects.equals(pattern, cards.pattern) 
                && Objects.equals(shape, cards.shape);
    }

    @Override
    public int hashCode() {
        return Objects.hash(number, color, pattern, shape);
    }
}

重写后LinkedHashSet就会根据四个属性值判断对象是否重复,符合你的业务需求。

步骤2:优化卡牌生成逻辑(可选,提升效率)

你现有的循环逻辑中,每次生成一张卡牌就来回在ArrayList和LinkedHashSet之间导数据,逻辑冗余效率低,可以直接简化为向LinkedHashSet中插入数据直到凑够81张不重复卡牌,再统一转成ArrayList:

LinkedHashSet<Cards> cardSet = new LinkedHashSet<>();
// 直到set中存满81张不重复卡牌再退出循环
while (cardSet.size() < 81) {
    int randomColor = ThreadLocalRandom.current().nextInt(0, 3);
    int randomNum = ThreadLocalRandom.current().nextInt(0, 3);
    int randomPattern = ThreadLocalRandom.current().nextInt(0, 3);
    int randomShape = ThreadLocalRandom.current().nextInt(0, 3);
    String cardColor = color[randomColor];
    String cardShape = shape[randomShape];
    int num = number[randomNum];
    String cardPattern = pattern[randomPattern];
    // 重复卡牌add会自动返回false,无需额外处理
    cardSet.add(new Cards(num, cardColor, cardPattern, cardShape));
}
// 直接将set转成ArrayList
ArrayList<Cards> cardHolder = new ArrayList<>(cardSet);
// 后续再将cardHolder元素加入队列即可

内容的提问来源于stack exchange,提问作者apex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 16:15:02