Как считать пары в покере с использованием Java и двух вложенных циклов - PullRequest
0 голосов
/ 18 мая 2018

Я очень новичок в программировании, и я пробовал упражнение.В основном мне нужно посчитать количество пар карт, которые я нахожу в несортированной строке из 5 карт.То, как я его интерпретировал, было, вероятно, неправильно. Например, одна из строк выглядит следующим образом: «sTh3c9hQ», где «пики», «10», «сердца» и т. Д. Я не уверен, почему мой код неработает .. Наверное, по очень логичным причинам, к которым я слеп.Может ли кто-нибудь предложить мне несколько предложений?Спасибо.

        int count = 0;
        for(int i = 0; i<hand.length()-2; i+=2){
            for(int j = 1; j<hand.length()-3; j+=2){
                if(hand.charAt(i) == hand.charAt(i+2) && hand.charAt(j) == 
                    hand.charAt(j+3)) {
                        count++;
                        }
                }
            }
        return count;

В случае 'sTh3c9hQ' желаемое значение будет равно 0, поскольку пар нет.Желаемый результат в случае 'sTh3c9sT' будет 1, так как есть одна пара.ЭСТ.Если бы было две пары, количество было бы 2. Если их было три, число было бы 3, т. Д.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018
//if only one pair can exist of each, this should work
int count = 0;
boolean par = false;
for(int i = 0; i<hand.length()-4; i+=2){
    par = false;
    for(int j = i+2; j<hand.length()-2 && !par; j+=2){
        if(hand.charAt(i) == hand.charAt(j)  && hand.charAt(i+1) ==  hand.charAt(j+1)) 
        {
            count++;
            par = true;
        }
    }
}
return count;
0 голосов
/ 18 мая 2018

Вот решение в одну строку:

return hand.replaceAll("[a-z]|(.)(?!.*\\1)", "").length();

Это заменяет все масти (строчные буквы) и все символы ранга, которые не имеют еще одну копию позже в строке с пробелом(т.е. удаляет их), оставляя только ряды, которые спарены.Вызов length() для результата дает вам количество пар.

См. живое демо регулярного выражения, соответствующего всем непарным символам.

0 голосов
/ 18 мая 2018

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

public int getPairs(final String hand) {
    int count = 0;
    List<String> cards = getParts(hand, 2);
    for (int i = 0; i < cards.size() - 1; i++) {
        for (int j = i + 1; j < cards.size(); j++) {
            if (cards.get(i).charAt(1) == cards.get(j).charAt(1)) {
                count++;
            }
        }
    }
    return count;
}

private static List<String> getParts(final String string,
                                     final int partitionSize) {
    List<String> parts = new ArrayList<>();
    int len = string.length();
    for (int i = 0; i < len; i += partitionSize) {
        parts.add(string.substring(i, Math.min(len, i + partitionSize)));
    }
    return parts;
}
...