为什么我的程序总是发重复的牌? (JAVA)

Why does my program keep dealing duplicate cards? (JAVA)

所以对于家庭作业任务,我必须制作一个程序来处理 N(命令行输入)数量的扑克牌(5 张牌)。我有一个 for-loop 检查卡片是否已被使用,但仍然打印了重复的卡片。任何帮助将不胜感激。

检查重复项的代码

do {///check for dupes
                    bUsed = false;
                    randS = (int) (Math.random() * 4);
                    randV = (int) (Math.random() * 13);
                   
                    for (int k = 0; k < 52; k++) {
                    value[randV]);
                        if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {

                            bUsed = true;
                        }
                    }


                } while (bUsed);///end check

完整代码

public class Deal {
public static void main(String[] args) {
    String[] suit = {"Hearts", "Diamonds", "Spades", "Clubs"};
    String[] value = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};

    String[] used = new String[52];
    boolean bUsed = false;
    int usedC = 0;

    int N = Integer.parseInt(args[0]);
    // int N = 4;

    if (N <= 10) {
        /////////check for max
        for (int i = 0; i < N; i++) {/////////print N amount of decks
            System.out.println("Deck " + (i + 1));
            for (int j = 0; j < 5; j++) {/////////print 5 cards

                int randV = 0;
                int randS = 0;

                do {///check for dupes
                    bUsed = false;
                    randS = (int) (Math.random() * 4);
                    randV = (int) (Math.random() * 13);
                    
                    for (int k = 0; k < 52; k++) {
                       
                        if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null)) {

                            bUsed = true;
                        }
                    }


                } while (bUsed);///end check

                used[usedC] = suit[randS] + value[randV];
                System.out.println(suit[randS] + " " + value[randV]);

                usedC++;
            }////end print 5 cards

            System.out.println();
        }///end print amount of decks
    } else {
        System.out.println("Too many decks requested");
    }
}

}

输出示例

java Deal.java 5 Deck 1 Clubs 6 Clubs 10 Clubs J Hearts Q Spades J

Deck 2 Hearts 4 Hearts 7 Hearts A Clubs J Diamonds 3

Deck 3 Spades K Diamonds 3 Diamonds Q Diamonds 4 Clubs 2

Deck 4 Spades 7 Diamonds 7 Diamonds 3 Clubs A Diamonds 9

Deck 5 Clubs 2 Spades 4 Diamonds 4 Diamonds 3 Spades 7

您正在比较字符串 == 而不是 .equals()

这是有问题的行:

if ((used[k] == (suit[randS] + value[randV])) && (used[k] != null))

首先你需要翻转 null-check 和 value-check,以防止 NullPointerException,因为 .equals() 是一个方法调用(对于运算符 == 这无关紧要)。然后使用方法进行比较,如:

if ((used[k] != null) && used[k].equals(suit[randS] + value[randV]))

除此之外,如果您使用 List<String> 作为 used 而不是数组,那么您的生活会轻松很多,因为在那里您可以简单地使用.contains 方法而不是你自己的循环 - 但我不知道你的作业是否允许这样做。

为了让你的程序快一点,你可以在if-block里面的末尾添加一个break;语句,这样你就可以在for-loop找到一个副本。