没有在ArrayList中查找对象

时间:2013-09-07 05:50:37

标签: java arraylist equals contain

我正在制作一张20张牌。他们每个人都从1-10被分配到整数总统。套牌应如下: 1,1,2,2,3,3 ...... 17,17,18,18,19,19,20,20

包含搜索表明它每次都是卡片中的新卡片。我相信我的equals()方法可能有问题,但我不确定。有什么想法吗?

// Class 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;
}

}

3 个答案:

答案 0 :(得分:3)

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

 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)永远不会成立,因为我每次都会改变。

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

答案 1 :(得分:2)

我不建议这样做,而是建议按顺序填充套牌,然后将其洗牌:

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

来自Collections.shuffle文档:

  

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

答案 2 :(得分:2)

cards.contains(temp)在do-while循环中永远不会为“true”,因为每个总统都有另一个卡号。