Как посмотреть, если массив имеет 4 одинаковых значения. Джава

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

public boolean isFourOfAKind(Card[] arr){}

Я изменяю arr[] на массив int, собирая каждое из значений карт 2-14 и сохраняю их в отдельном массиве. Как проверить (эффективно), совпадают ли 4 числа в этом массиве?

* ПРИМЕЧАНИЕ: я передаю массив из 7 карт

Мой метод двух пар (из запросов)

   /*
     * Returns 0 if no two pairs
     *  else returns the highest card out of the two pairs, 
     *  if two hands have the same highest pair then further inspection is needed
     */
    public static int isTwoPair(Card[] arr){
        int hold[] = new int[5];
        int values[] = new int[arr.length];
        int max = 0;
        boolean total = false;
        for(int i=0;i<arr.length;i++){
            values[i] = arr[i].getValue();
        }
        for(int i = 0;i<values.length;i++){
            for(int j = 0;j<values.length;j++){
                if(i==j){
                    continue;
                }
                if(values[i]==values[j]){
                    if(values[i]>max){
                        max = values[i];
                    }
                    int hold1 =0;
                    int hold2=0;

                    hold1 = j;
                    hold2=i;
                    int counter = 0;
                    for(int ii = 0;ii<values.length;ii++){
                        if(ii==j||ii==i){
                            continue;
                        }
                        hold[counter] = values[ii];
                        counter++;

                    }
                    //                     for(int iii: hold){
                    //                     System.out.print(" , "+ iii);
                    //                     }
                    //                     System.out.println();
                    if(isPair(hold)==0){
                        max = 0;
                        total = false;
                    }else{
                        int holdInt = isPair(hold);
                        if(holdInt>max){
                            max = holdInt;
                        }
                        total = true;
                    }
                }
            }
        }
        return max;

    }

2 ответа

Я бы предпочел сделать это так:

public boolean isFourOfAKind(Card[] arr){
    int[] counts = new int[15];
    for (Card c: arr) {
        counts[c.cardNum]++;
        if (counts[c.nameOfTheFieldWithCardNumber] == 4) return true;
    }
    return false;
}

также вы можете легко изменить этот метод для проверки 2/3 комбинаций вида / фулл-хауса

Если вы отсортируете массив по рангу (2,3,...,King,Ace) тогда следующие проверки все станут намного проще:

  • Straight flush (повышение ранга в сочетании с Flush проверять)
  • Four of a kind (4 одинаковых ранга сгруппированы вместе)
  • Full house (первые 2 равны, а последние 2 равны, а середина равна одному из них)
  • Straight (увеличение ранга)
  • Three of a kind (3 одинаковых ранга сгруппированы вместе)
  • Two pair (2 группы одного ранга)
  • One pair (2 одинаковых ранга сгруппированы вместе)
  • High card (последняя карта)

Единственное, что не приносит пользы, это Flushи проверка для этого не требует никакой сортировки, так что это не проблема.

Другие вопросы по тегам