簡體   English   中英

包含所有數組列表的Java

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM