2014-11-24 2 views
0

Я создаю программу Java, которая имитирует игру Сердца. У меня есть Card класса, который я создал для другого карточной игры моделирования:Реализация сопоставима с 2 перечислениями

public abstract class Card implements Comparable<Card>{ 

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

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

    private Suits suit; 
    private Values value; 

    public Card(final Values value, final Suits suit) { 
     this.value = value; 
     this.suit = suit; 
    } 

    public Values getValue() { 
     return value; 
    } 

    public Suits getSuit() { 
     return suit; 
    } 

    public void showCard() { 
     value = getValue(); 
     suit = getSuit(); 

     System.out.println(value + " of " + suit); 
    } 

    private int compareTo(final Card comparedToCard) { 
     //code here 
    } 

} 

мне нужна помощь, реализующей метод compareTo. У меня есть опыт использования этого метода и как он должен возвращать 1, 0 или -1 на основе того, как вы хотите сравнить объекты. Тем не менее, я никогда не реализовал его, используя enums. Я знаю, что класс класса Enum сопоставим, но даже после просмотра документации по API я не знаю, как сравнить две перечисления.

Мой желаемый результат будет сортировать ArrayList<Card> таким образом, что они будут отсортированы сначала по Suit: Club -> Diamond -> лопата -> Сердце и также сортировки по Value так: Club (2 -> Ace), Diamond (2-> Ace), ЭСТ ...

Любая помощь будет высоко ценится

+0

Не забудьте реализуйте 'equals' и' hashCode', когда вы реализуете 'compareTo'! В настоящее время вы сможете иметь две одинаковые карты в стеке! –

+0

Небольшой совет, который я выбрал из SO: в 'compareTo' называть другой объект' that'; таким образом вы сравниваете 'this' и' that' :) –

ответ

1

Каждая константа перечисления в Java в качестве ассоциированного значения порядкового. Это значение можно получить, вызвав метод ordinal() для константы, например. SPADE.ordinal().

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

2

Enum уже имеет compareTo. Это зависит от порядкового значения константы перечисления. Ординал присваивается перечислениям в порядке появления.

Для сердец и многих игр значение карты, однако, в зависимости от состояния игры. Поэтому, хотя вы можете использовать по умолчанию compareTo из Values для сравнения карт одного цвета, вам все равно необходимо определить фактическое значение карты в очереди. В сердцах не имеет смысла использовать порядок в цвете. Вы не должны создавать compareTo в классе карты.

Для карточных игр compareTo следует использовать с осторожностью и не должно быть динамичным. Если заказ - это что-то другое, кроме порядка по умолчанию в вашем вопросе, не используйте его вообще. Помните, compareTo предназначен для сравнения в наборе элементов с нулевым порядком . Во многих карточных играх ценность карт колеблется в игре, поэтому нет такого естественного порядка.


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

public class TurnComparator implements Comparator<Card> { 
    private final Suits firstCardSuite; 

    TurnComparator(Suits firstCardSuite) { 
     this.firstCardSuite = firstCardSuite; 
    } 

    @Override 
    public int compare(Card o1, Card o2) { 
     if (o1.suit != firstCardSuite && o2.suit != firstCardSuite) { 
      return 0; 
     } 

     if (o1.suit != firstCardSuite && o2.suit == firstCardSuite) { 
      return -1; 
     } 


     if (o1.suit == firstCardSuite && o2.suit != firstCardSuite) { 
      return 1; 
     } 

     return o1.value.compareTo(o2.value); 
    } 
} 
0

Перечни имеют естественный порядок, поэтому сравните с помощью свойства костюма, а затем по значению:

@Override 
public int compareTo(Card o) 
{ 
    return Comparator.comparing(Card::getSuit) 
        .thenComparing(Card::getValue) 
        .compare(this, o); 
} 

Или, если вы хотите компаратор:

Comparator<Card> comp = Comparator.comparing(Card::getSuit) 
            .thenComparing(Card::getValue); 
+0

Так что лопаты всегда ниже сердец или бриллиантов? –

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