繁体   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