我正在玩纸牌游戏。无论如何,我不知道如何从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
,这实际上只是引用比较,因此,如果if
和nextCard
是对完全相同的对象的引用,则仅进入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;
}
}
假设
Rank
和Suit
是枚举(为了使equals
中的引用相等性检查合适)。您可能也想在Card
构造函数中添加无效检查。关于java - 无法从ArrayList中删除对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12018449/