Java 有没有办法调试这个排序函数?

Java 有没有办法调试这个排序函数?,java,list,sorting,Java,List,Sorting,您好,我目前正在尝试编写一个扑克游戏来训练我的java技能 为了确定游戏中最好的牌是什么(这样机器人可以做出好的决定),我给每一个可能的牌分配一个整数列表,这些整数取决于他们手上有什么牌以及场上有什么牌 例如,一个与最高牌位a 6同花顺的玩家将拥有as列表[8,6,0] 其中8代表同花顺,6代表同花顺中最高的一张牌(最后一个数字只适用于双人或全套)。 拥有一对10的玩家将拥有as列表[1,10,0,0,12,0] 其中前三个数字代表一对(1代表一对,10代表一对的值),最后三个数字代表玩家手上最

您好,我目前正在尝试编写一个扑克游戏来训练我的java技能

为了确定游戏中最好的牌是什么(这样机器人可以做出好的决定),我给每一个可能的牌分配一个整数列表,这些整数取决于他们手上有什么牌以及场上有什么牌 例如,一个与最高牌位a 6同花顺的玩家将拥有as列表[8,6,0]

其中8代表同花顺,6代表同花顺中最高的一张牌(最后一个数字只适用于双人或全套)。 拥有一对10的玩家将拥有as列表[1,10,0,0,12,0]

其中前三个数字代表一对(1代表一对,10代表一对的值),最后三个数字代表玩家手上最高的牌(0代表最高的牌,12代表女王)

在straith flush的情况下,不需要最高的卡,因此列表只包含3个整数

现在,问题是我的排序方法工作得很好,但有时它会给我错误(这是一种我经常使用的方法,所以它可能只适用于1/10000),并且程序使用了大量随机数,所以程序不会执行两次相同的操作,当它不工作时,同一方法会出现两种类型的错误(有时是一个,有时是另一个):

“java.util.ConcurrentModificationException”和“java.lang.IndexOutOfBoundsException”但我的java技能还不足以告诉我如何处理它

我试图用print调试它,但没有发现任何不自然的地方。 系统告诉我错误来自此方法,但我不确定

这是有问题的代码

    public List<Score> meilleurScore(List<Score> scores) {

        int x = 0;
        int y = 0;
        Joueur joueurGagnant;
        List<Score> scoresGagnants = new ArrayList<>();
        List<Score> toutLesScores = new ArrayList<>();
        List<Score> scoresPasEncoreFait = new ArrayList<>();
        List<Score> scoresEnCourse = new ArrayList<>();
        List<Integer> meilleureListe = new ArrayList<>();
        List<Score> scoresAEliminer = new ArrayList<>();

        scoresPasEncoreFait.addAll(scores);
        scoresEnCourse = equilibrerLesScores(scoresEnCourse);
        while (toutLesScores.size() < scores.size()) {

            // System.out.println(meilleureListe);
            meilleureListe.clear();
            // System.out.println(toutLesScores.size());
            // System.out.println(scoresPasEncoreFait.size());
            scoresEnCourse.clear();
            // scoresAEliminer.addAll(scoresEnCourse);
            scoresEnCourse.addAll(scoresPasEncoreFait);

            for (int j = 0; j < scoresEnCourse.get(0).integers.size(); j++) {
                meilleureListe.add(0);
                meilleureListe.add(0);
                meilleureListe.add(0);
            }

            if (scoresEnCourse.get(0).integers.size() > 0) {
                for (int i = 0; i < scoresEnCourse.get(0).integers.size(); i++) {

                    scoresEnCourse.removeAll(scoresAEliminer);
                    // System.out.println("3"+ scoresEnCourse);
                    scoresAEliminer.clear();

                    for (Score score : scoresEnCourse) {
                        // System.out.println(score.integers.get(i));
                        // System.out.println(meilleureListe.get(i));
                        // System.out.println("meilleur "+meilleureListe);

                        if (score.integers.get(i) < meilleureListe.get(i)) {

                            scoresAEliminer.add(score);
                        }
                        if ((score.integers.get(i) == meilleureListe.get(i)) && (!scoresGagnants.contains(score))) {
                            scoresGagnants.add(score);
                        }
                        if (score.integers.get(i) > meilleureListe.get(i)) {
                            for (Score score2 : scoresEnCourse) {
                                {
                                    if (score == score2) {
                                        break;
                                    }
                                    if ((score.integers.get(i) > score2.integers.get(i))
                                            && (!scoresAEliminer.contains(score2))) {
                                        scoresAEliminer.add(score2);
                                    }
                                }

                            }

                            scoresGagnants.clear();
                            scoresGagnants.add(score);
                            meilleureListe = score.integers;

                        }
                        if (scoresEnCourse.size() == 1) {
                            /* System.out.println("size==1 "+scoresEnCourse); */
                            toutLesScores.addAll(scoresEnCourse);
                            scoresPasEncoreFait.removeAll(scoresEnCourse);
                            scoresAEliminer.addAll(scoresEnCourse);

                        }

                    }

                }
                /* System.out.println("else "+scoresGagnants); */
                toutLesScores.addAll(scoresGagnants);
                scoresPasEncoreFait.removeAll(scoresGagnants);
                scoresAEliminer.addAll(scoresEnCourse);

            }

        }

        return toutLesScores;
    }

(索引和大小不总是0) 第596行是:

for (Score score : scoresEnCourse){
第582行是:

    for (int i=0;i<scoresEnCourse.get(0).integers.size();i++){

for(int i=0;i您应该考虑“手列表”上的comparatorFunction,然后您就有了手…(num players),并使用“手”之间的可比接口对“手列表”进行排序。最后一个或第一个将是赢家,这取决于您如何使用排序功能的可比函数(比较).如果我理解了你们计划的目标,即决定胜负

“手牌”是牌的集合……每手牌有5张牌来检查玩家手上的牌……(从无到成对、成对、完整、顺序、齐平)

一只手必须能与另一只手相媲美,就是这样


cya.

在循环中,您有一个
scoresenscourse.clear()
。如果执行此操作,则会导致出现您看到的异常。可以通过添加到
scoresAEliminer
来替换该语句。我更改了它,但它仍然显示错误感谢更改它-基本上,无论何时迭代列表,都要避免在循环中更改该列表的元素。还要粘贴更新了代码,这样我们就可以看到当前的状态。正确地格式化、正确缩进会有很大帮助——这应该是IDE中的一个简单按键(例如在windows上的eclipse上,它只是Ctrl-Shift-F).我在帖子上编辑了它。每手牌都有一个分数,这就是视图…分数将是牌的组合。我猜扑克游戏中复杂的是分数函数。因为这也取决于每一套牌。
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at Table.meilleurScore(Table.java:596)
    at Table.trouverLeRangDeCetteMain(Table.java:656)
    at Table.chanceDeGagnerPlusTard(Table.java:1025)
    at Table.caractereDevin(Table.java:806)
    at Table.faireLesMises(Table.java:688)
    at Main.main(Main.java:60)
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Table.meilleurScore(Table.java:582)
    at Table.trouverLeRangDeCetteMain(Table.java:656)
    at Table.chanceDeGagnerPlusTard(Table.java:997)
    at Table.caractereDevin(Table.java:806)
    at Table.faireLesMises(Table.java:688)
    at Main.main(Main.java:53)
for (Score score : scoresEnCourse){
    for (int i=0;i<scoresEnCourse.get(0).integers.size();i++){