Java列表包含-由于重复的哈希码而产生误报

问题描述 投票:0回答:1

这可能是非常基本的,我有一个“卡”列表,其中“卡”对象只有一个“数字”字段(int)。另一个列表“ listB”包含该列表的子集。

当我遍历第一个列表时,检查每个元素是否:

listB.contains(card);

我得到误报。一些具有相同编号但不属于listB的卡返回“ true”。原因必须是它们具有相同的哈希码。

如何在不丑化简单的“ Card”类的情况下避免这种冲突?我只希望每个Card实例都是唯一的,而不管它的“数字”值如何]

public interface Card {
}

public class NumberCard implements Card {
private int number;

public NumberCard(int number) {
    this.number = number;
}

public int getNumber() {
    return number;
}

@Override
public String toString() {
    return Integer.toString(number);
}
}

public class Setup {
public static List<Card> getCards(){
    List<Card> cards = new ArrayList<>();
    int amount = 4;
    add(cards, 4, new NumberCard(0));
    add(cards, 4, new NumberCard(1));
    add(cards, 4, new NumberCard(2));
    add(cards, 4, new NumberCard(3));
    add(cards, 4, new NumberCard(4));

    return cards;
}

private static void add(List<Card> cards, int amount, Card card) {
    for (int i = 0; i < amount; i++) {
        cards.add(card);
    }
}
}
public DeckOfCards() {
    cards = Setup.getCards();
    Collections.shuffle(cards);
}
public class Player {
private List<Card> cards;
private List<Card> hidden;

}

如果我在“玩家”“卡”字段中随机存储4张卡然后从4中选择2作为“隐藏”如果相同的卡号同时出现在两个“隐藏”和“非隐藏”中,则

for(Card card:cards){if(hidden.contains(card){

对于两个隐藏的”和“非隐藏的”都将返回true。

这可能非常基础,我有一个“卡”列表,其中“卡”对象只有一个“数字”字段(int)。另一个列表“ listB”包含该列表的子集。当我循环浏览第一个列表时,...

java hash
1个回答
0
投票

您需要做两件事来处理这种情况:

  1. [创建另一个字段,在private String id中说NumberCard,并确保该字段的值对于每张卡都是唯一的。换句话说,此字段应作为每张卡的唯一标识符。
© www.soinside.com 2019 - 2024. All rights reserved.