0

20枚のデッキを作っています。それらのそれぞれには、1 から 10 までの整数プレジデントが割り当てられます。デッキは次のようになります: 1, 1, 2, 2, 3, 3, ... 17, 17, 18, 18, 19, 19, 20, 20

含む検索では、毎回デッキ内の新しいカードであると表示されます。equals() メソッドに何か問題があるのではないかと思いますが、よくわかりません。何か案は?

// クラス MainClass

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

Your equals is perfectly fine. Looks like a logical mistake to me:

 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());
    }

This will generate 20/4000 possible combinations. If you want (1,1)(2,2)....(20,20), your current loop may generate (1,11)(2,13)...(20,5).

Also, cards.contains(temp) will never be true, because i is changed each time.

I am still not sure what exactly are you trying to do? If its just shuffle the deck @PaulBellora's answer seems correct.

于 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

cards.contains(temp) is never "true" in the do-while loop becaues every President have a other card number.

于 2013-09-07T06:08:10.173 に答える