#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
}
}