2013-11-21 47 views
3
public boolean isTwoPair() { 
    boolean isTwoPair = false; 
    Collections.sort(deck); 
    List<Card> cards = new LinkedList<Card>(deck); 
    System.out.println(cards); 
    for (int i = 0; i < cards.size()-1; i++) { 
     for (int j = i + 1; j < cards.size()-1; j++) { 
      if (deck.get(i).equals(deck.get(j))) { 
       cards.remove(i); 
       cards.remove(j); 
       System.out.println(cards); 
      } 
     } 

    } 
    return isTwoPair; 

} 

我認爲我的問題是與我的cards.remove()。當我取出一張卡片時,下次卡片被取出時,它將從已更改的列表中刪除。有一種方法可以從列表中刪除兩個項目,而它們具有相同的索引編號?從列表中刪除項目通過索引列表循環時通過列表

如果我有,因爲它們都是對像這樣以去除索引0,1:

[Ace,Ace,Three,Four,Four] 

代碼中移除這樣的(除去索引0)

[Ace,Three,Four,Four] 

比,而不是刪除來自第一個列表的索引1(Ace)將其從第二個列表中移除0122,第二個列表中有三個是dex 1。

這就是我期待

[Three,Four,Four] 

在這一點上,我希望我的循環拿起和刪除四個,四

編輯:

public boolean isTwoPair() { 
    boolean isTwoPair = false; 
    Collections.sort(deck); 
    List<Card> cards = new LinkedList<Card>(deck); 
    System.out.println(cards); 
    for (int cardOne = 0; cardOne < cards.size(); cardOne++) { 
     for (int cardTwo = cardOne + 1; cardTwo < cards.size(); cardTwo++) { 
      if (deck.get(cardOne).equals(deck.get(cardTwo))) { 
       cards.remove(cardOne); 
       cards.remove(cardTwo-1); 
       System.out.println(cards); 
       for(int cardThree = 0; cardThree < cards.size(); cardThree++){ 
        for(int cardFour = cardThree+1; cardFour < cards.size(); cardFour++){ 
         if(cards.get(cardThree).equals(cards.get(cardFour))){ 
          cards.remove(cardThree); 
          cards.remove(cardFour-1); 
          System.out.println(cards); 
          isTwoPair = true; 
         } 
        } 
       } 
      } 
     } 

    } 
    return isTwoPair; 

} 

這就是我現在使用,我真的不想做一個新的變量,如果我不必這樣做,我決定不刪除對象

+0

不刪除王牌,只需保存的地方,它們形成一對的事實。 –

+1

另一種選擇是用'null'替換項目,並忽略'null'項目。 –

+0

我其實嘗試了類似於將數組索引設置爲null的方式,但它立刻給了我一個錯誤,我該如何忽略空值? – gallly

回答

3

如果你知道j總是大於i(因爲for循環),如果你刪除索引i元素第一,那麼你可以用指數j - 1得到預期的結果刪除的元素。

cards.remove(i); 
cards.remove(j-1); 
+1

您確定要從'i = 0'循環到' Christian

2

使用List.remove(Object)代替List.remove(int)。這不會取決於列表的順序了。

public boolean isTwoPair() { 
    boolean isTwoPair = false; 
    Collections.sort(deck); 
    List<Card> cards = new LinkedList<Card>(deck); 
    for (int i = 0; i < cards.size()-1; i++) { 
     for (int j = i + 1; j < cards.size()-1; j++) { 
      cardI = deck.get(i); 
      cardJ = deck.get(j); 
      if (cardI.equals(cardJ)) { 
       cards.remove(cardI); 
       cards.remove(cardJ); 
       isTwoPair = true; 
      } 
     } 

    } 
    return isTwoPair; 

} 
+0

感謝這工作,我不知道有一個選項刪除對象 – gallly

1
cards.remove(i); 
cards.remove(j); 

只要你從LinkedList除去的元素,它轉移所有後續元素向左(減去一個從它們的指數)。如果j > i您可以使用j-1而不是j。或者,代替cards.remove(Card)

1

的問題是,當你從你不佔的事實,尺寸不去除後,同一元素的索引取出後改變列表中刪除對象

假設你要刪除在元素和0和1

initially => [Ace,Ace,Three,Four,Four] 
       0 1 2  3 4 

刪除[0]

after removing [0] => [Ace,Three,Four,Four] 
         0 1  2 3 

刪除[1]

after removing [1] => [Ace,Four,Four] 
         0 1  2 

因此你不能爲我們去除指數,而是使用List.remove(Object)