реализовать интерфейс Comparable. Заказывайте карточки с разными оценками, от самого низкого до высшего, [дубликат]

Компилятор хочет, чтобы вы это записывали:

private static List<String> list = new ArrayList<String>();

, потому что в противном случае вы могли бы добавить любой тип, который вам нравится, в list, делая создание как new ArrayList<String>() бессмысленным. Java generics - это только функция времени компиляции, поэтому объект, созданный с помощью new ArrayList<String>(), с радостью примет Integer или JFrame элементы, если они назначены ссылке «raw type» List - сам объект ничего не знает о какие типы он должен содержать, только компилятор делает.

0
задан user2928701 4 February 2014 в 03:40
поделиться

3 ответа

Чтобы ответить на вопрос о compareTo: a.compareTo(b) должен вернуть что-то отрицательное, если a меньше b, положительное, если a больше b и 0, если они равны. Кроме того, если вы заказываете объекты, одно из правил, которым должно следовать упорядочение, заключается в том, что если a.compareTo(b) < 0, то b.compareTo(a) > 0. (Вы не можете иметь оба параметра «a меньше b», а «b меньше a»). Ваш compareTo, который просто возвращает -1 в любое время, когда карты не равны, не следует этому правилу. Чтобы исправить это, вам нужно будет принять решение о заказе. Как выглядит «сортированная колода»? Вероятно, все клубы вместе, а затем все бриллианты и т. Д., Что означает, что любая клубная карта будет меньше любой алмазной карты. Чтобы сделать это правильно, сначала вам нужно сравнить костюмы, а ранги - только если костюмы равны:

public int compareTo (Card aCard){
    int suitCompare = this.aSuit.compareTo(aCard.aSuit);
    if (suitCompare != 0)  {
        return suitCompare;
    }
    return this.aNumeral.compareTo(aCard.aNumeral);
}

compareTo на каждом enum вернет <0, 0 или >0. Таким образом, вы можете сравнить костюмы, вернуть значение <0 или >0, а затем сравнить ранги, если костюмы равны. Это общий подход для написания любого метода compareTo, где необходимо проверить несколько фрагментов данных.

1
ответ дан ajb 20 August 2018 в 22:10
поделиться

Прежде всего, если ваш enum имеет параметр, вы должны объявить конструктор с параметром:

public enum Numerals {
    DEUCE(2), THREE(3), FOUR(4), FIVE(5), SIX(6), SEVEN(7), EIGHT(8), NINE(9), TEN(
            10), JACK(11), QUEEN(12), KING(13), ACE(14);
    private Numerals(int i) {
        this.value = i;
    }

    int value;
}

. Чтобы создать колоду yor, вы должны перебирать свои костюмы и цифры и создавать карту для каждой пары:

public Deck() {
    for (Suits s : Suits.values()) {
        for (Numerals n : Numerals.values()) {
            cards.add(new Card(s, n));
        }
    }
}

Из compareTo javadoc: сравнивает этот объект с указанным объектом для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, так как этот объект меньше, равен или больше указанного объекта.

Итак, вы должны объявить заказ для вашего класса карты реализовать сравните (используя ординалы)

public int compareTo(Card o) {
    if(this.suit.ordinal() == o.suit.ordinal()){
        return this.numeral.ordinal() - o.numeral.ordinal();
    }
    return this.suit.ordinal() - o.suit.ordinal();
}

Надеюсь, что это поможет.

PS: будьте осторожны, переопределяя метод равенства , посмотрите здесь

1
ответ дан Community 20 August 2018 в 22:10
поделиться
  • 1
    Прошу прощения за то, что вы обратились к вам с благодарностью за это так поздно. Это имеет смысл. Сейчас я во второй последовательности Java, и многое было брошено на нас, которое не было описано в последовательности 1. – user2928701 5 February 2014 в 01:00

, если вы используете идеал типа eclipse, он расскажет вам, какие методы вам нужно реализовать для интерфейсов:

import java.util.*;
class Card {}
class Deck implements Cloneable,Iterable<Card>,Comparator<Card> {
    public Deck() {}
    @Override public int compare(Card arg0,Card arg1) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override public Iterator<Card> iterator() {
        // TODO Auto-generated method stub
        return null;
    }
    private ArrayList<Card> cards;
}

итератор прост, так как в списке массивов есть один. ищите примеры сопоставимых. вам придется как-то инициализировать колоду. Я поставил статический конечный массив в классе моей карты, который содержал все карты. вы можете сделать все из этого массива, используя массивы в виде списка.

1
ответ дан Ray Tayek 20 August 2018 в 22:10
поделиться
  • 1
    Так что у меня для итератора есть: public Iterator & lt; Card & gt; итератор () {return cards.iterator (); }, который я использую итератор, который уже имеет ArrayList. Извините, если мое форматирование здесь странное, я новичок в этом форуме и, возможно, спотыкаюсь о правильном выполнении ... – user2928701 5 February 2014 в 01:01
  • 2
    звучит так, должно работать. – Ray Tayek 5 February 2014 в 05:45
Другие вопросы по тегам:

Похожие вопросы: