[英]ContainsAll array list issue Java
所以我试图使用内建的containsAll列表方法来比较两个数组
我对单个值使用了contains方法,它可以完美工作,但是contains all方法却不能。
我正在玩纸牌游戏,所以我要检查一组纸牌是否也位于另一组纸牌中
所以:
if(this.hand.containsAll(hand.getCards())){
但是,此语句始终返回false。
这是构造函数
private ArrayList<Card> hand;
public Hand(ArrayList<Card> hand) {
this();
this.hand.addAll(hand);
}
这是获取卡方法
public ArrayList<Card> getCards() {
return this.hand;
}
不确定为什么这段代码没有为containsAll返回true,但是单独完成就可以了,是否有一些我没有考虑过的通用概念?
任何指针都是奖励
谢谢
编辑:
使用时返回true:
作品
public boolean hasCard(Card card){
if (this.hand.contains(card)){
return true;
}
}
不
public boolean hasCards(Hand hand){
if(this.hand.containsAll(hand.getCards()){
return true
}
}
主要..
Card one = new Card(Card.Rank.ACE, Card.Suit.CLUBS);
Card two = new Card(Card.Rank.ACE, Card.Suit.DIAMONDS);
Card three = new Card(Card.Rank.TWO, Card.Suit.SPADES);
Card four = new Card(Card.Rank.SIX, Card.Suit.randSuit());
Card five = new Card(Card.Rank.SEVEN, Card.Suit.randSuit());
ArrayList<Card> cards = new ArrayList<>();
cards.add(one);
cards.add(two);
cards.add(three);
cards.add(four);
cards.add(five);
Hand h = new Hand(cards);
Card ones = new Card(Card.Rank.ACE, Card.Suit.CLUBS);
Card twos = new Card(Card.Rank.ACE, Card.Suit.DIAMONDS);
Card threes = new Card(Card.Rank.TWO, Card.Suit.SPADES);
ArrayList<Card> cards2 = new ArrayList<>();
// works
h.hasCard(five);
// doesn't
h.hasCards(h2);
cards2.add(ones);
cards2.add(twos);
cards2.add(threes);
Hand h2 = new Hand(cards2);
试试这个h.hasCard(new Card(Card.Rank.ACE, Card.Suit.CLUBS))
。 它填充返回false。 但是,此h.hasCard(one)
返回true。
要了解原因,请尝试以下操作: one.equals(new Card(Card.Rank.ACE, Card.Suit.CLUBS)
。这是同一张卡的两个实例,但是java无法知道它。它们是两个不同的对象。
你添加one
到你的h
手,因此,寻找一个对象时,你会发现它。 但是搜索另一个对象new Card(Card.Rank.ACE, Card.Suit.CLUBS)
失败,因为Java不知道它代表同一张卡。
要解决此问题,您必须覆盖Card
上的equals
消息,并使其对与同一张Card对应的对象返回true。
您的containsAll
呼叫由于相同的原因而无法正常工作:手中包含所有卡,但它们由不同的对象表示。 实现equals
方法也可以解决该问题。
您需要重写equals
方法。
执行此操作时:
Card five = new Card(Card.Rank.SEVEN, Card.Suit.randSuit());
h.hasCard(five);
您实质上是在检查(five == five)
,这是正确的。 这是因为equals()
方法的默认实现是(来自doc ):
类Object的equals方法在对象上实现了最有区别的对等关系。 也就是说,对于任何非空参考值x和y,当且仅当x和y引用同一个对象(x == y的值为true)时,此方法才返回true。
现在,当您拥有包含以下卡的h2时:
Card ones = new Card(Card.Rank.ACE, Card.Suit.CLUBS);
Card twos = new Card(Card.Rank.ACE, Card.Suit.DIAMONDS);
Card threes = new Card(Card.Rank.TWO, Card.Suit.SPADES);
h
下列卡片:
Card one = new Card(Card.Rank.ACE, Card.Suit.CLUBS);
Card two = new Card(Card.Rank.ACE, Card.Suit.DIAMONDS);
Card three = new Card(Card.Rank.TWO, Card.Suit.SPADES);
Card four = new Card(Card.Rank.SIX, Card.Suit.randSuit());
Card five = new Card(Card.Rank.SEVEN, Card.Suit.randSuit());
然后您执行:
h.hasCards(h2);
然后,您实际上是在检查h
是否存在ones, twos and threes
。 这是假的,因为例如ones
不 ==
在任何物体h
。
您可以通过打印将为false的(ones == one)
值来自己检查。
解:
如果您在类Card
覆盖equals()
方法,则类似于:
@Override
public boolean equals(Object o) {
// Check if o == itself
if (o == this) {
return true;
}
// Check to see if o is instance of Card or not
if (!(o instanceof Card)) {
return false;
}
// typecast o to Card to compare
Card c = (Card) o;
// check equality (assuming Rank and Suit to be int, else you need to change equality condition here)
return this.Rank == c.Rank
&& this.Suit == c.Suit;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.