2011-02-08 175 views
0

我有這個腳本,它是假設一個玩家可以協助一個特定卡的西裝的標識符。所以,如果他協助,顯示消息,你協助,沒有問題,但如果他做了虛張聲勢,驗證永遠不會完成,並顯示其他的System.out.println(手);包含java-問題

的這個別的結果是[鑽石SEVEN,黑桃FOUR,黑桃SEVEN,鑽石的KING,更多卡片]

pn50.getText()(這樣做的結果是例如俱樂部)

我的疑問是,什麼原因線hand.subList(0,10)。載有(pn50.getText())從來沒有覺得沒有什麼列表(也就是玩家的手)

例如,如果玩家扮演心中之王,而玩家二扮演七個俱樂部並擁有三個心中的手,則假設顯示消息「玩另一個」

@Override 
    public boolean validCard(List<Card> hand, JTextField pn70, JTextField pn50, int i) { 
     if(pn70.getText().equals (pn50.getText())) { 
      System.out.println("you assist"); 
      return true; 
     } else { 
      if (hand.subList(0, 10).contains(pn50.getText())) { 
       System.out.println("play another"); 
       } 
      else 
       System.out.println(hand); 
     } 
     return false; 
    } 

有幫助嗎?

感謝

+0

另外,作爲一個邊評論,爲什麼只是想看看是否在手比賽的前11卡嗎? – shoebox639 2011-02-08 15:37:25

+0

這是一個例子,目前我正在用較少的牌進行比賽 – user455318 2011-02-08 15:43:43

+0

比賽並不重要,我認爲重點是檢查整個牌局。但在這裏,你只是看第一個11。 – shoebox639 2011-02-08 16:05:38

回答

1

這裏最簡單的解決方案是隻是一個循環調用替換到contains

boolean contained = false; 
for (Card card : hand.subList(0, 10)) { 
    if (card.suit().equals(pn50.getText()) { 
    contained = true; 
    break; 
    } 
} 

if (contained) { 
    // ... 
} else { 
    // ... 
} 
5

因爲你是一個比較字符串:pn50.getText()Card對象。 Contains使用.equals方法來測試相等性,除非您將Card上的.equals方法設置爲與另一個String進行比較,該方法包含的內容永遠不會返回任何內容。

下面是一個解決方案。我假設你可以從字符串中創建Card對象,所以只需將該字符串包裝到Card對象中並進行比較即可。

Card c = new Card(pn50.getText()); 
if (hand.subList(0, 10).contains(c)) { 
    System.out.println("play another"); 
} 
else 
    System.out.println(hand); 

你也將需要重寫卡上的.equals方法是這樣的:

public boolean equals(Card other) { 
    return other.getSuit().equals(this.getSuit()) && other.getNumber().equals(this.getNumber()); 
} 
+3

另外請注意,允許`Card`從`equals`返回'true`作爲`String`會嚴重違反equals的合約,因爲它不會自反(當給定相同的'Card`時,'String`不會返回'true')。 – ColinD 2011-02-08 15:48:55

0

也許問題是,你是比較型的對象(你的名單是這個類型)字符串JTextField.getText() returns String)? :)

包含。您可能想要覆蓋hashCode()等於()方法對象。

0

這是因爲您的來源列表包含卡片,因此您的子列表也包含卡片。 pn50.getText()返回從不等於卡的字符串。