Сравнение объектов Java: реализация метода `compareTo()` для карточной игры

Я делаю метод, используя метод сравнения строк «compareTo». Однако у меня есть несколько вопросов, касающихся того, как именно это работает.

 public int compareTo(Card player2){    
    int finalRank = this.getRank().compareTo(player2.getRank());


    int turn = this.getRank().compareTo(player2.getRank());

    // Checks for "War" before anything is processed
    if(this.getRank() == player2.getRank())
    {
    return 0; // results in war
    }

    //This logic sets Ace as the highest card
    //after checking for "WAR"
    else if(this.getRank() == Rank.ACE)
    {
    return 1;
    }


    else if(player2.getRank() == Rank.ACE)
    {
    return -1;
    }


    //If it is not an ace, the winner per turn
    //is determined by standard value.
    else if(turn > 0)
    {
        //System.out.println("playerOne wins");
    return 1;
    }

    else 
    {
        //System.out.println("playerTwo wins");
    return -1;  
    }   

        }//end compareTo

Это моя часть кода в методе compareTo. ** Так что я могу упомянуть, что я получил довольно много интерактивной помощи для этого сегмента кода. Пока мне это объясняли, это имело смысл. Таким образом, если это имеет для меня смысл, я смогу переписать этот сегмент кода в другом формате. Однако я обнаружил, что не могу этого сделать. Поэтому ищу совета и помощи.

Функция

int turn = this.getRank().compareTo(player2.getRank());

вообще то, что меня сбивает. Что именно делает метод compareTo?

для хода игроков это сравнение двух карт в игре -> следование логике программы.

Могу ли я сравнивать карты с помощью метода compareTo?

Вот как у меня настроены конструкторы классов.

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

Список карт взят из двух разных классов -> Масть и Ранг

private Rank rCard;
  private Suit sCard;

/** ************* *********** * Инициализация объекта вне класса Card * @ param rCard * @param sCard * ************ ************* */ public Card(Rank rCard, Suit sCard) { this.rCard = rCard; this.sCard = sCard; }


person user2592982    schedule 13.10.2013    source источник
comment
Зачем нужен другой способ?   -  person PM 77-1    schedule 13.10.2013
comment
Вы не разместили конструкторы, о которых вы упомянули.   -  person 0x6C38    schedule 13.10.2013
comment
Что именно вы не понимаете в compareTo()? Я не знаю логики игры, стоящей за этим, но метод довольно прост, он просто выполняет кучу сравнений и возвращает int на основе разных сценариев.   -  person 0x6C38    schedule 13.10.2013
comment
Почему? Я просто хочу убедиться, что понял материал. Лично мне неудобно использовать compareTo. Вместо того, чтобы просто копировать, вставлять то, что мне дали через help. Я бы предпочел иметь возможность повторять код, чтобы я лично чувствовал, что понимаю его.   -  person user2592982    schedule 13.10.2013
comment
@Mr D - Это для игры в войну. Причина, по которой я говорю, что не понимаю метод compareTo(), заключается в том, что я не могу использовать какие-либо другие методы сравнения строк, чтобы заставить этот код работать. Все, что я могу буквально сделать, это изменить имена переменных, что меня не удовлетворило бы. Итог - я не пытаюсь обмануть этот проект, а скорее получаю помощь и повторяю ее в своем собственном коде.   -  person user2592982    schedule 13.10.2013


Ответы (1)


Прежде всего, цель метода compareTo() состоит в том, чтобы определить, что делает два объекта сопоставимыми. Не все объекты сопоставимы. Некоторые объекты делаются сопоставимыми с помощью Java API. Например, String сопоставимо. Таким образом, если бы вы использовали такой метод, как Collections.sort(someStringArray), эту задачу можно было бы выполнить, поскольку объекты сопоставимы. С другой стороны, если вы хотите sort() массив ваших Card объектов, это невозможно сделать, пока вы не сделаете объект Card сопоставимым. Вы делаете это, используя метод compareTo(). Вы также хотите определить свой класс Card как интерфейс implements Comparable, в котором вам придется @Override метод compareTo(). Это сделает ваши Cards сопоставимыми по рангу, если вы решите сравнить их по рангу в compareTo().

Я полагаю, вы пытаетесь сравнить два объекта по рангу.

int turn = this.getRank().compareTo(player2.getRank());

is generally what throws me off. What exactly is the compareTo method doing?

Вы сравниваете ранг this, который, как я предполагаю, равен Player1, с рангом player2. Когда вы используете метод compareTo(), вы возвращаете int. Это int говорит вам, чей ранг выше... 1 означает, что player1 ранг выше, -1 означает, что player2 ранг выше, а 0 означает, что ранги равны. Я предполагаю, что это int определит, чья сейчас очередь

Кроме того, я считаю, что это:

int turn = this.getRank().compareTo(player2.getRank());

должен быть помещен вне метода compareTo() и должен быть изменен на это:

int turn = this.compareTo(player2);

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

person Paul Samsotha    schedule 13.10.2013