2014-11-19 4 views
0

Я создаю карточную игру и хотел бы перебирать все возможные комбинации карт.итерация по всем комбинациям карт

Например (Туз червей, Два Сердца), (Туз червей, два из Spades), (Туз червей, два из клубов) .... и т.д.

Я делаю это в Java

в настоящее время у меня есть это:

начать с меня

List<Card> deckOfCards = new ArrayList<Card>(); 

, который колода содержит все карты. Затем я создаю

Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>(); 
     deckOfCardsWithoutDuplicates = deckOfCards; 

Теперь я хочу повторить все карты без дубликатов.

 for (Card c : deckOfCards) { 

      deckOfCardsWithoutDuplicates.remove(c); 
      for (Card c1 : deckOfCardsWithoutDuplicates) { 

//something here irrelevant 

      } 
      deckOfCardsWithoutDuplicates.add(c); 
     } 

Однако я получаю java.util.ConcurrentModificationException. Может ли кто-нибудь дать мне несколько советов о том, как это сделать лучше?

+0

просто взять копию списка. итерации по основному списку с внешним циклом. итерации через список копий с внутренним циклом. вы не можете выполнять операции добавления-удаления в списке, который выполняется с помощью 'for'. –

ответ

1

Это потому, что вы пытаетесь удалить из списка, который вы просматриваете.

Чтобы удалить из списка, который вы Перебор, вам нужно использовать iterator

0

Попробуйте использовать Итератор вместо Еогеасп петли

Iterator<Card> iter = deckOfCards.iterator(); 
    while (iter.hasNext()) { 
    //your logic here 
} 

При использовании foreach loop, вы используете итератор неявно.

ConcurrentModificationException происходит, когда коллекция модифицируется «одновременно» с прохождением итератора по коллекции любыми средствами, за исключением итератора.

0

Ваше имя, кажется, указывает, что вы считаете, что у вас есть два списка, один из которых первоначально был копией другого, но был изменен при обходе оригинала. Но они на самом деле являются одним и тем же списком, и, как отмечено в других ответах, вы получите это исключение, когда вы измените список, который вы просматриваете.

Если вы изменили свой код, чтобы они были действительно отдельными списками, проблема, которую вы показали, не произойдет.

Изменить

Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>(); 
deckOfCardsWithoutDuplicates = deckOfCards; 

в

Queue<Card> deckOfCardsWithoutDuplicates = new LinkedList<Card>(deckOfCards); 

, и вы будете иметь возможность изменять deckOfCardsWithoutDuplicates во время цикла через deckOfCards.

0

Образец Singleton и Builder придет вам на помощь.

Синглтон используется для предоставления номеров и стоимости карточек.Пример

Suite:

public class Suit { 
    private String suit; 
    private Suit(String name) {suit = name;} 
    public String toString() {return suit;} 
    public final static Suit CLUBS = new Suit("clubs"); 
    public final static Suit DIAMONDS = new Suit("diamonds"); 
    public final static Suit HEARTS = new Suit("hearts"); 
    public final static Suit SPADES = new Suit("spades"); 
} 

То же самое с классом значения, класс карты должен быть Singleton тоже, но они так и должны быть комбинацией двух других Singleton (Люкс и Value):

public class Card { 
    private Suit s; 
    private Value v; 
    protected Card() {} 
    protected Card(Suit s, Value v) { 
    this.s = s; 
    this.v = v; 
    } 
} 

уникальная карта си гарантия от застройщика карты (с помощью Builder Pattern):

import java.util.Hashtable; 
public class CardBuilder extends Card { 
    private Hashtable<String,Card> _cards = new Hashtable<String,Card>(); 
    public Card getCard(Suit s, Value v) { 
    String key = s.toString() + v.toString(); 
    Card result = _cards.get(key); 
    if (result == null) { 
     result = new Card(s,v); 
     _cards.put(key,result); 
    } 
    return result; 
    } 
} 

И теперь у вас есть все, что вам нужно, в хэш-таблице возьмите след карт, которые вы используете, и не используйте его снова. Теперь есть главный, что вы можете проверить выполнение в чеке высокоуровневой:

public class Game { 
    public static void main(String args[]) { 
    CardBuilder cb = new CardBuilder(); 
    Card c1 = cb.getCard(Suit.HEARTS, Value.JACK); 
    Card c2 = cb.getCard(Suit.HEARTS, Value.JACK); 
    if (c1 == c2) System.out.println("Ok!!!"); 
    else System.out.println("Something wrong in you implementation!"); 
} 
} 

Я надеюсь, что этот пример может помочь в вашей реализации игры :)

Смежные вопросы