Сортировка колоды карт по масти и затем ранга - PullRequest
4 голосов
/ 10 января 2011

У меня есть этот класс Java:

class Card
{
    private Suit suit;
    private int  rank;
}

(Suit - это перечисление)

Существует четыре масти с рангом 1-9 каждая и четыре масти с одним возможным рангом0. Каждая карта существует в неизвестном, но постоянном среди всех карт количестве копий.Как бы я отсортировал колоду в установленном порядке мастей и увеличив ранг в каждой масти?

Ответы [ 6 ]

3 голосов
/ 10 января 2011

Вам потребуется либо

  1. реализовать интерфейс Comparable на объекте карты: добавьте функцию compareTo, которая определяет, должна ли быть другая карта до или после этогоодин в порядке сортировки
  2. реализует объект Comparator , который принимает две карты и указывает, в каком порядке они должны появляться в

, а затем вы можете использовать Collections.sort в вашем списке.

2 голосов
/ 10 января 2011

Посмотрите на реализацию Comparable в перечислении.

2 голосов
/ 10 января 2011

Сделайте ранжирование enum тоже, и вы можете сдать отсортированную колоду следующим образом:

    for (Suit suit : Suit.values())
        for (Rank rank : Rank.values())
            deck.add(new Card(rank, suit));
1 голос
/ 10 января 2011

заставить его реализовать интерфейс Comparable. Есть только один метод, который вам нужно написать. Затем их можно сравнивать друг с другом, и у вас есть несколько существующих опций сортировки, например, статическая Arrays.sort, если у вас есть массив, или Collections.sort, если он имеет вид Collection (список, вектор и т. Д.)

Помимо реализации на Card вам, возможно, придется сделать то же самое для Suit в зависимости от того, как это сделано.

0 голосов
/ 05 июня 2015

Быстрый способ выполнить эту задачу - Radix Sort . Создайте массив списков значений карт, затем пройдите по своей колоде, поместив каждую карту в соответствующий список по мере ее появления. Затем объедините все списки в частично отсортированную колоду. Теперь сделайте то же самое, только с массивом списков мастей. Объедините все списки вместе, и у вас должна быть отсортированная колода.

0 голосов
/ 05 июня 2015

Вот пример класса карты.Как следует из вопросов, костюм должен быть определенного класса, в то время как ранг будет целым числом (в этом примере я не реализовывал проверку ранга).Реализация класса Comparable позволяет классу Card сравнивать другой класс Card.Так что список / набор карт можно отсортировать.

public class Card implements Comparable<Card>{

    private SUIT cardSuit;
    private int cardRank;

    public enum SUIT {SPADE, CLUB, HEART, DIAMOND};

    public Card(int cardRank, SUIT cardSuit) {
        this.cardSuit = cardSuit;
        this.cardRank = cardRank;
    }

    /**
     * Generates a random card
     */
    public Card(){
        this((int) (Math.random() * 9) , SUIT.values()[(int) (Math.random() * SUIT.values().length)]);
    }

    public String getSuit() {
        return cardSuit.toString();
    }

    public int getRank() {
        return cardRank;
    }

    @Override
    public int compareTo(Card2 o) {
        if (this.cardRank == o.cardRank) {
            return this.cardSuit.compareTo(o.cardSuit);
        } else {
            return o.cardRank - this.cardRank;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...