2014-01-29 107 views
0

我想在撲克牌中的兩張牌之間進行比較..他們每個人都有套裝和等級,我想檢查是否有重複的東西來創建異常。 。需要這段代碼的幫助!可以使用equals方法還是錯誤的?!在Java中比較兩個對象..每個對象都有兩個字段

import java.util.ArrayList; 

public class Pokerhand { 

    public final int CARDS_NUMBER = 5; 
    ArrayList<Card> cards = new ArrayList<Card>(); 

    public Pokerhand (Card card1 , Card card2, Card card3, Card card4, Card card5) 
    { 
     cards.add(card1); 
     cards.add(card2); 
     cards.add(card3); 
     cards.add(card4); 
     cards.add(card5); 
    } 

    private boolean check(ArrayList<Card> cards) 
    { 
     if (cards.size() != CARDS_NUMBER) 
      throw new IllegalArgumentException("Incorrect number of cards!! "); 

     for (int i=0 ; i<= cards.size(); i++) 
     { 
      if (cards.get(i).equals(cards.get(i+1))) 
       throw new IllegalArgumentException("Duplicat card"); 
     } 
    } 
} 
+1

'equals()'很好用,只要你在'Card'類中實現了它。 – Keppil

+0

您應該覆蓋Card類中的equals()。 –

+0

它可以使用等於,但我認爲等於沒有在您的卡類實現。所以你必須覆蓋你的卡片類的equals方法。 – kai

回答

0

你應該考慮實現你的卡類可比。說每張卡都有等級(1國王)和花色(紅桃,方塊等)的方法的compareTo會是什麼樣子:

public int compareTo(Card anotherCard) { 
    if (this.suit.equals(anotherCard.suit) && this.rank.equals(anotherCard.rank)) { 
    return 0; 
    } 
    else if (this.suit.equals(anotherCard.suit)) { 
    return this.rank.compareTo(anotherCard.rank); 
    } 
    else { 
    return this.suit.compareTo(anotherCard.suit); 
    } 
} 

那麼你應該只使用card1.compareTo(卡2)== 0,而不是card1.equals(卡2)

0

應覆蓋equals方法,或者它只是比較兩個對象的引用,而不是卡片的價值。

這裏有一個例子:

public class Card { 

    private int rank; 

    private int suit; 

    @Override 
    public boolean equals(Object obj) { 

     if (!(obj instanceof Card)) { 
      return false; 
     } 
     Card c = (Card) obj; 
     return this.rank == c.rank && this.suit == c.suit; 
    } 
} 
0

而不是

if (cards.get(i).equals(cards.get(i+1))) 
    throw new IllegalArgumentException("Duplicat card"); 

嘗試:

if(cards.get(i).getSuit() == cards.get(i+1).getSuit() 
    && cards.get(i).getRank() == cards.get(i+1).getRank()) 
    throw new IllegalArgumentException("Duplicat card"); 

這樣你比較與比較對象引用相比,對象內的值是相同的。

0

你也許可以使用枚舉來更好地建模。例如:

import java.util.EnumSet; 

public class PokerGame { 

    public enum Suit { 
     SPADES, HEARTS, DIAMONDS, CLUBS 
    } 

    public enum Rank { 
     ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGH, NINE, TEN, JACK, QUEEN, KING 
    } 

    public enum Card { 
     ACE_OF_SPADES(Rank.ACE, Suit.SPADES), 
     TWO_OF_SPADES(Rank.TWO, Suit.SPADES), 
     THREE_OF_SPADES(Rank.THREE, Suit.SPADES), 
     FOUR_OF_SPADES(Rank.FOUR, Suit.SPADES), 
     FIVE_OF_SPADES(Rank.FIVE, Suit.SPADES); 
     // the other cards left as an exercise for the reader (-; 

     private Rank rank; 
     private Suit suit; 

     Card(Rank rank, Suit suit) { 
      this.rank = rank; 
      this.suit = suit; 
     } 

     public Rank rank() { 
      return rank; 
     } 

     public Suit suit() { 
      return suit; 
     } 
    } 

    public static void main(String[] args) { 
     EnumSet<Card> deck = EnumSet.allOf(Card.class); 
     System.out.println(deck.size()); 
    } 
} 

然後,您可以使用EnumSet創建套牌或手牌,始終保證是唯一的。

附加此言一出,下面的邏輯是有缺陷的:

for (int i=0 ; i<= cards.size(); i++) 
    { 
     if (cards.get(i).equals(cards.get(i+1))) 
      throw new IllegalArgumentException("Duplicat card"); 
    } 

這將拋出()IndexOutOfBoundsException異常,因爲你迭代高達cards.size和acccessing cards.get(I + 1)。此外,這不會檢測到不相鄰的重複項。

+0

非常感謝你:) –