我正在玩纸牌游戏。无论如何,我不知道如何从ArrayList中删除卡。这是我正在使用的代码:

private List<Card> cardDeck = new ArrayList<Card>();

public void removeCard(Card card) {
    for (Iterator<Card> it = cardDeck.iterator(); it.hasNext();) {
        Card nextCard = it.next();
        if (nextCard.equals(card)) {
            cardDeck.remove(card);
            System.out.println("removed " + card);
        }
    }
}


如果需要,这是卡类:

    public class Card {

    public Card(Rank rank, Suit suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public Rank getRank() {
        return rank;
    }

    public Suit getSuit() {
        return suit;
    }

    @Override
    public String toString() {
        return getRank().toString().toLowerCase() + " of "
                + getSuit().toString().toLowerCase();
    }

    private Rank rank;

    private Suit suit;

}


我已经尝试了所有方法,但不会将其删除。有小费吗?

最佳答案

当您遍历集合时,要删除项目的唯一方法是在迭代器上调用remove。因此,您应该使用:

if (nextCard.equals(card)) {
    it.remove();
    System.out.println("removed " + card);
}


请注意,由于您没有覆盖equals,这实际上只是引用比较,因此,如果ifnextCard是对完全相同的对象的引用,则仅进入card语句的正文。 。

当然,如果您只想删除卡的方法,则应该可以将其更改为:

public void removeCard(Card card) {
    cardDeck.remove(card);
}


...当然,对平等也有同样的警告。

要覆盖equals(和hashCode为保持一致性),我首先将Card设置为最终类,然后编写:

public final class Card {
    ...

    @Override
    public boolean equals(Object other) {
        if (!(other instanceof Card)) {
            return false;
        }
        Card otherCard = (Card) other;
        return this.rank == otherCard.rank &&
               this.suit == otherCard.suit;
    }

    @Override
    public int hashCode() {
        int hash = 17;
        hash = hash * 31 + rank.hashCode();
        hash = hash * 31 + suit.hashCode();
        return hash;
    }
}


假设RankSuit是枚举(为了使equals中的引用相等性检查合适)。您可能也想在Card构造函数中添加无效检查。

关于java - 无法从ArrayList中删除对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12018449/

10-09 15:45
查看更多