繁体   English   中英

尝试在没有内置 class 的情况下洗牌 ArrayList 时出现 UnsupportedOperationsException

[英]UnsupportedOperationsException while attempting to shuffle an ArrayList without built-in class

正如我所说,我正在尝试创建一个 ArrayList,然后在洗牌器中写入,我使用的是 Fisher-Yates,作业说没有内置插件。 但是,每次我运行它时,我都会得到 UnsupportedOperationsException。 我试图阅读它给出的行以及谷歌上的许多答案,但是我仍然不确定是什么导致了错误。

import java.util.*;

public class CardShuffler {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        cardDeck deckCards = new cardDeck();
        deckCards.newMethod(deckCards.deckOfCards);
        //System.out.println(deckOfCards);

    }
}
import java.util.*;

public class cardDeck {

    ArrayList deckOfCards;

    public cardDeck() {

        ArrayList<String> deckOfCards = new ArrayList();
        deckOfCards.add("JC");
        deckOfCards.add("QC");
        deckOfCards.add("KC");
        deckOfCards.add("AC");
        deckOfCards.add("JD");
        deckOfCards.add("QD");
        deckOfCards.add("KD");
        deckOfCards.add("AD");
        deckOfCards.add("JH");
        deckOfCards.add("QH");
        deckOfCards.add("KH");
        deckOfCards.add("AH");
        deckOfCards.add("JS");
        deckOfCards.add("QS");
        deckOfCards.add("KS");
        deckOfCards.add("AS");

        //String cardDeck = deckOfCards.toString();

        //System.out.println("Before shuffling " + cardDeck);
        //int numCards = deckOfCards.size();

        //System.out.println(numCards);
        System.out.println("Before shuffling " + "\n" + deckOfCards);

    }

    public ArrayList getDeckOfCards() {
        return deckOfCards;
    }

    //Now shuffle the cards

    public void newMethod(List<ArrayList> deckOfCards) {

        //int numCards = deckOfCards.size();
        int numCards = 16;
        Random random = new Random();
        random.nextInt();
        for (int i = 0; i < numCards; i++) {
            int change = i + random.nextInt(numCards - i);
            Collections.swap(deckOfCards, i, change);
            System.out.println("After shuffling " + random);

        }
    }

}

我还应该将元素放在 4x4 数组中,

XX XX XX XX
XX XX XX XX
XX XX XX XX
XX XX XX XX

但我开始认为那是一个笑话,到处看了看,似乎很困难。

谢谢。

Before shuffling 
[JC, QC, KC, AC, JD, QD, KD, AD, JH, QH, KH, AH, JS, QS, KS, AS]
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.get(int)" because "l" is null
    at java.base/java.util.Collections.swap(Collections.java:501)
    at cardDeck.newMethod(cardDeck.java:53)
    at CardShuffler.main(CardShuffler.java:9)

Process finished with exit code 1

编辑我意识到是什么导致了 UnsupportedOperationsException,修复了它(我的交换中有一个 int,而不是我的 Arraylist)。 但是,现在我收到 null 错误,它说“l”是 null,我的代码中没有“l”。 再次编辑我发现''null''是由于“public void newMethod(ArrayList deckofCards),deckOfCards是null。我以为我已经在构造函数中声明了所有元素?

import java.util.*;

public class CardShuffler {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        cardDeck deckCards = new cardDeck();

        //System.out.print(cardDeck.deckOfCards);

        cardDeck.shuffleArray(cardDeck.deckOfCards);
        for (Object i : cardDeck.deckOfCards) {
            System.out.println(i);
        }


    }
}
import java.io.File;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

public class cardDeck {

    static ArrayList deckOfCards;

    public cardDeck() {

        List<String> deckOfCards = new ArrayList<>();
        deckOfCards.add("JC");
        deckOfCards.add("QC");
        deckOfCards.add("KC");
        deckOfCards.add("AC");
        deckOfCards.add("JD");
        deckOfCards.add("QD");
        deckOfCards.add("KD");
        deckOfCards.add("AD");
        deckOfCards.add("JH");
        deckOfCards.add("QH");
        deckOfCards.add("KH");
        deckOfCards.add("AH");
        deckOfCards.add("JS");
        deckOfCards.add("QS");
        deckOfCards.add("KS");
        deckOfCards.add("AS");

        //String cardDeck = deckOfCards.toString();

        //System.out.println("Before shuffling " + cardDeck);
        //int numCards = deckOfCards.size();

        //System.out.println(numCards);
        System.out.println("Before shuffling " + "\n" + deckOfCards);

        this.deckOfCards = (ArrayList) deckOfCards;

    }

    public ArrayList getDeckOfCards() {
        return deckOfCards;
    }

    //Now shuffle the card

    public static void shuffleArray(List<Integer> a) {
        int numCards = a.size();
        //int numCards = 16;
        Random random = new Random();
        random.nextInt();
        for (int i = 0; i < numCards; i++) {
            int index = random.nextInt(i + 1);
            Collections.swap(a, i, index);
        }
    }

    public static void swap(List<Integer> deckOfCards, int i, int change) {
        int helper = deckOfCards.get(i);
        deckOfCards.set(i, deckOfCards.get(change));
        deckOfCards.set(change, helper);
    }


}

Output:

[JC, QC, KC, AC, JD, QD, KD, AD, JH, QH, KH, AH, JS, QS, KS, AS]
[JC, QC, KC, AC, JD, QD, KD, AD, JH, QH, KH, AH, JS, QS, KS, AS]JD
AS
JH
AD
QC
KC
KS
QD
AC
JC
JS
KD
QH
KH
AH
QS

所以我通过改变编码解决了我的问题的洗牌部分。 现在我在打印过程中被困在格式上,正如我所说我需要将它格式化(包括预洗牌)如下

xx xx xx xx
xx xx xx xx
xx xx xx xx
xx xx xx xx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM