包含所有数组列表问题Java

时间:2016-01-16 15:52:35

标签: java arrays list

所以我试图使用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);

2 个答案:

答案 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;
}