Реализован класс PokerHand для ранжирования покерных рук.
Конструктор принимает на вход строку, содержащую пять карт: PokerHand hand = new PokerHand("KS 2H 5C JD TD"). В качестве разделителя используется пробел; описание каждой карты состоит из 2х символов – номинал карты и масть.
Реализована возможность сортировки рук «по силе» от сильной к слабой. Масть в подсчете силы руки не участвует.
Алгоритм ранжирования (определения силы руки) реализован посредством создания для каждой руки собственного строкового литерала.
- Реализованы методы сортировки карт по номиналу sortCardsByRanks() и мастям sortCardsBySuits(). При вызове данных методов производится проверка входящей строки на корректность.
- Номиналы карт преобразованы в буквенные символы в алфавитной очередности (13 номиналов от туза до двойки – в значения от A до M соответственно).
- Создан метод countDuplicates() для подсчета количества дублирующихся номиналов в руке.
- Для каждой руки сформирована map, в которой ключами являются номиналы карт (A-M), а значениями – количество данного номинала в руке. Map отсортирована по значениям по убыванию, для последующего определения вида комбинации (пример [A-2, C-2, K-1] - Two pairs).
- Сформирован ряд методов определения комбинации и метод создания выходной строки defineCombination(). Первым символом выходной строки является код комбинации (значение от A до J – от самой сильной (Royal Flush) до самой слабой (Highcard)). Последующие символы – номиналы карт из map.
- Сравнение (сортировка) рук производится на основании полученных строк, посредством переопределенного метода compareTo(). Разные комбинации сравниваются "на уровне" первого символа строки, одинаковые комбинации – по последующим символам (по старшинству карт).
- Сформированы unit-тесты для проверки корректности определения комбинаций и их сравнения.