Как посмотреть, если массив имеет 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
и проверка для этого не требует никакой сортировки, так что это не проблема.