[英]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.