Получение индекса перечисления из объекта? (Java)

#java #object #enums

#java #объект #перечисления

Вопрос:

У меня есть карточка объекта, которая создается с использованием двух перечислений, которые являются мастью и рангом. Эти перечисления читаются как таковые (извиняюсь за форматирование, не совсем уверен, как это сделать правильно):

 public enum Suit
{
    HEARTS(),
    DIAMONDS(),
    SPADES(),
    CLUBS();
}

public enum Rank
{
    TWO(),
    THREE(),
    FOUR(),
    FIVE(),
    SIX(),
    SEVEN(),
    EIGHT(),
    NINE(),
    TEN(),
    JACK(),
    QUEEN(),
    KING(),
    ACE();
}
 

Конструктор Card выглядит следующим образом:

 public Card(Suit s, Rank r) //s and r are fields in class Card
    {
        suit = s;
        rank = r;
    }
 

Итак, допустим, объект Card создан с БУБНАМИ масти и девяткой ранга, которые, как я знаю, являются индексами 1 и 7 соответственно.

Метод, называемый Hand, имеет дело с ArrayList из 5 объектов Card и сортирует их по значению, чтобы упростить их упорядочивание определенным образом. Возможно ли получить эти индексы из объекта Card для этой цели или есть какой-то другой способ сделать это?

Добавленное примечание: это для назначения, поэтому я ограничен необходимостью использования перечислений и списков массивов.

Комментарии:

1. Перечисления имеют ordinal() , которые могут быть полезны здесь. Например Rank.TWO.ordinal() , равно нулю, поскольку это первый элемент в перечислении. Rank.THREE.ordinal() равно единице и т.д.

2. Вы можете добавить поле индекса в свои перечисления

3. Помогают ли они? Перечисляемые типы и перечислимые типы

Ответ №1:

Лучшим решением было бы определить значения для конкретных элементов в перечислении

 public enum CardSuits {

    HEARTS(1),
    CLUBS(2),
    DIAMONDS(3),
    SPADES(4);

    public final int rank;

    private CardSuits(int rank){
        this.rank = rank;
    }

    public int getRank() {
        return rank;
    }
}
 

Затем вы можете вызвать CardSuits.SPADES.getRank() , чтобы получить его значение, когда это необходимо. Таким образом, значения полностью определены вами точно, и не будет никакой путаницы, если кто-то поменяет порядок местами.

Ответ №2:

Вы можете создать поле-член, вызываемое index в вашем Suit и Rank перечислениях следующим образом:

 public enum Suit {
    HEARTS(0),
    DIAMONDS(1),
    SPADES(2),
    CLUBS(3);

    private final int index;

    Suit(int i) {
        this.index = i;
    }

    public int getIndex() { return this.index; }
}

public enum Rank {
    TWO(2),
    THREE(3),
    FOUR(4),
    FIVE(5),
    SIX(6),
    SEVEN(7),
    EIGHT(8),
    NINE(9),
    TEN(10),
    JACK(11),
    QUEEN(12),
    KING(13),
    ACE(1);

    private final int index;

    Rank(int i) {
        this.index = i;
    }

    public int getIndex() { return this.index; }
}
 

Затем вы можете использовать его в своем Card классе следующим образом:

 public class Card {
    private final Suit suit;
    private final Rank rank;

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

    public Suit getSuit() { return this.suit; }

    public Rank getRank() { return this.rank; }

    public static void main(String[] args) {
        Card card = new Card(Suit.DIAMONDS, Rank.NINE);

        System.out.println(card.getSuit().getIndex()); // Prints 1
        System.out.println(card.getRank().getIndex()); // Prints 9
    }
}