0

我正在创建一副 20 张卡片。他们每个人都从 1 到 10 分配了整数总统。甲板应如下所示: 1, 1, 2, 2, 3, 3, ... 17, 17, 18, 18, 19, 19, 20, 20

包含搜索表明它每次都是套牌中的一张新牌。我相信我的 equals() 方法可能有问题,但我不确定。有任何想法吗?

//类主类

public void createDeck() {
    cards = new ArrayList<President>();
    President temp;
    for (int i = 1; i <= 20; i++) {
        do {
            temp = new President(i, rand(20));
            System.out.println(cards.contains(temp));
        } while (cards.contains(temp));
        cards.add(temp);
        System.out.println(cards.size());
    }
    for(President p : cards){
        while(p.getPresident() > 10){
            p.setPresident(p.getPresident() - 10);
        }
        System.out.println("" + p.getPresident());
    }

}

//班长

public class President {

private int president;
private int card;

public President(int card, int president) {
    super();
    this.card = card;
    this.president = president;

}

@Override
public boolean equals(Object o) {
    if(o instanceof President){
        President p = (President) o;
        if(p.getPresident() == this.president && p.getCard() == this.card){
            return true;
        }
    }
    return false;

}

private int getCard() {
    // TODO Auto-generated method stub
    return card;
}

public int getPresident() {
    // TODO Auto-generated method stub
    return president;
}

public void setPresident(int president) {
    // TODO Auto-generated method stub
    this.president = president;
}

}

4

3 回答 3

3

你的equals完全没问题。对我来说似乎是一个逻辑错误:

 for (int i = 1; i <= 20; i++) {
        do {
            temp = new President(i, rand(20));
            System.out.println(cards.contains(temp));
        } while (cards.contains(temp));
        cards.add(temp);
        System.out.println(cards.size());
    }

这将生成 20/4000 种可能的组合。如果您想要 (1,1)(2,2)....(20,20),您的当前循环可能会生成 (1,11)(2,13)​​...(20,5)。

此外, cards.contains(temp)永远不会是真的,因为 i 每次都会改变。

我仍然不确定你到底想做什么?如果它只是洗牌@PaulBellora的答案似乎是正确的。

于 2013-09-07T06:08:30.747 回答
2

与其这样,我建议按顺序填充牌组,然后洗牌:

cards = new ArrayList<President>(20);
for (int i = 1; i <= 20; i++) {
    cards.add(new President(i, i));
}
Collections.shuffle(cards);

Collections.shuffle文档中:

使用默认随机源随机排列指定列表。所有排列都以大致相等的可能性发生。

于 2013-09-07T05:58:25.893 回答
2

card.contains(temp) 在 do-while 循环中永远不是“真”,因为每个总统都有一个其他卡号。

于 2013-09-07T06:08:10.173 回答