Java - 如何在不排序的情况下检查扑克牌中的顺子?

标签 java arrays sorting poker

这不是重复的。我知道如果可以排序,这是多么容易,但我不允许对数组使用排序方法,也不允许我自己编写。我在任何地方都找不到任何帮助,包括 StackOverflow。

在这种情况下,我有一个方法可以检查五张牌是否是顺子。我有一个卡片对象,它包含一个值(整数)和一套西装(整数)。我也有一些关于实现这个方法的规则。

  • 除了A以外没有其他牌
    • A 可以算作 1 或 10,但不能同时算作
  • 顺子不能环绕
  • 您不能使用数组的排序方法或编写自己的排序方法

最后一条规则让我丧命。我有一系列卡片。如果我可以对它进行排序,这会很容易,但我什至无法编写自己的方法来对数组进行排序。对于我的其他方法,可以简单地遍历手并将有关手的信息存储在两个单独的数组中,如下所示:

private static int[] cardValues = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
private static int[] cardSuits = {0, 0, 0, 0, 0};

private static void evaluationHelper(Card[] cards) {
    for (int i = 0; i < cardValues.length; i++) {
        cardValues[i] = 0;
    }

    for (int i = 0; i <cardSuits.length; i++) {
        cardSuits[i] = 0;
    }

    for (int i = 0; i < 5; i++) {
        cardValues[cards[i].getValue() - 1]++;
        cardSuits[cards[i].getSuit()]++;

        if (cards[i].getValue() == 1) {
            cardValues[9]++;
        }
    }
}

所以在我第一次尝试解决这个问题时,我尝试了这样的事情:

public static boolean hasStraight(Card [] cards) {
    int sequenCounter = 0;
    evaluationHelper(cards);

    for (int i = 0; i < cardValues.length; i++) {
        if (sequenCounter != 5) {
            if (cardValues[i] != 0) {
                sequenCounter++;
            } else {
                sequenCounter = 0;
            }
        } else {
            return true;
        }
    }
    return false;
}

那没用。然后我尝试了这个:

public static boolean hasStraight(Card [] cards) {
    int min = 100, max = 0;
    boolean seenSix = false, seenAce = false;
    evaluationHelper(cards);

    for (int i = 0; i < cards.length; i++) {
        if (cards[i].getValue() > max) {
            max = cards[i].getValue();
        }

        if (cards[i].getValue() < min) {
            min = cards[i].getValue();
        }

        if (cards[i].getValue() == 6) {
            seenSix = true;
        }

        if (cards[i].getValue() == 1) {
            seenAce = true;
        }
    }

    if (seenSix && seenAce) {
        max = 10;
    }

    if (max - min == 4) {
        return true;
    }
    return false;
}

那也不行。我感到很沮丧,因为这两种尝试在检查过程中经历了许多不同的变化,但没有任何效果。我什至不明白为什么他们不工作。我所掌握的唯一信息是这种方法没有吐出正确的值。我不知道传递给该方法的值是什么。不知道测试的时候吐出的是什么方法。当它应该是正确的时,它可能会吐出错误,反之亦然。请帮忙!

最佳答案

在您的 evaluationHelper 中,当 A 是 10 时您忘记解决添加:

if (cards[i].getValue() == 10) {
    cardValues[0]++;
}

至少会让你的第一个解决方案起作用(我还没有检查第二个)。

请注意,此方法所做的仍然是 Radix sort 的一种形式所以我不确定它是否满足您的要求。

关于Java - 如何在不排序的情况下检查扑克牌中的顺子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47361959/

相关文章:

python - 在日期时间字段中按小时对 NumPy 数组进行分箱

c++ - 使用数组 vector 的正确方法

php - 根据项目计数修改列跨度

algorithm - 对 [0,2k] 之间的一系列 n 个数字进行排序,每对之间存在 : |Ai-Aj|>=k/n

java - 给定一个数字 n,列出所有 n 位数字,使得每个数字都没有重复数字

java - Swing 工具栏放置

ios - 按照与另一个数组相同的顺序对一个数组进行排序

r - R语言排序与分组

java - 列数与行的值数不匹配。如何匹配值

java - Java 中的数字到单词