所以我试图使用containsAll内置列表方法来比较两个数组
我对单个值使用了contains方法并且它完美地工作,但是包含所有不包含的内容。
我正在制作纸牌游戏,所以我要检查一组纸牌是否也在另一组纸牌中
这样:
if(this.hand.containsAll(hand.getCards())){
然而这句话一直都是假的..
这是构造函数
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;
}
}
没有按&#39;吨
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);
答案 0 :(得分:0)
试试这个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不知道它代表同一张卡。
要解决此问题,您必须覆盖equals
上的Card
消息,并使其对应于同一张卡的对象返回true。
您的containsAll
电话无法正常工作:手牌包含所有牌,但它们由不同的对象表示。实现equals
方法也将解决这个问题。
答案 1 :(得分:0)
您需要覆盖equals
方法。
执行此操作时:
Card five = new Card(Card.Rank.SEVEN, Card.Suit.randSuit());
h.hasCard(five);
你基本上检查(five == five)
这是真的。这是因为equals()
方法的默认实现是(来自doc):
类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为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);
然后,您基本上检查ones, twos and threes
中是否存在h
。这是错误的,因为例如ones
==
h
中的任何对象。
您可以通过打印(ones == one)
的值来自行检查,这将是错误的。
解决方案:
如果您覆盖类equals()
中的Card
方法,请执行以下操作:
@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;
}