一切都在这里工作,除了在我洗牌后试图展示甲板。我不知道为什么,但是在洗牌之后,arraylist似乎是空的。如果我注释掉洗牌代码,Deck会显示,但显然没有洗牌。由于这是一个赋值,我需要我的程序保持相同的通用格式,并且洗牌算法需要保持尽可能相同。
public class Shuffler
{
public static void selectionShuffle(ArrayList<Card> values) {
ArrayList<Card> shuffled = new ArrayList<Card>();
ArrayList<Card> copy = new ArrayList<Card>();
for (int k = 51; k >= 0;) {
int r = (int)(Math.random() * (double)52);
if (r < values.size()) {
shuffled.add(values.get(r));
values.remove(r);
k--;
}
}
for (int i = 0; i < values.size(); i++) {
values.set(i, shuffled.get(i));
}
}
这是Deck构造函数,它从三个数组中创建一个甲板,形成三个卡片对象。
public class Deck
{
public static ArrayList<Card> cards = new ArrayList<Card>();
private int size;
public Deck(String[] ranks, String[] suits, int[] values)
{
for (int i = 0; i < values.length; i++) {
cards.add(new Card(ranks[i], suits[i], values[i]));
}
size = values.length;
shuffle();
}
public void shuffle() {
Shuffler.selectionShuffle(cards);
size = size();
}
}
答案 0 :(得分:2)
这应该是:
for (int i = 0; i < shuffled.size(); i++) {
values.add(shuffled.get(i));
}
你有问题:
for (int i = 0; i < values.size(); i++) {
values.set(i, shuffled.get(i));
}
此时值的大小为0,因此它不会执行任何操作...您从值中删除了所有元素,因此它的大小为0.
答案 1 :(得分:0)
Java通过引用传递对象,这意味着如果你的函数是manilupating更改的对象,它也会在函数调用后被更改。
在此致电selectionShuffle
:
public void shuffle() {
Shuffler.selectionShuffle(cards);
size = size();
}
selectionShuffle
函数操纵传递的列表cards
。因为您调用values.remove(r);
,所以当函数完成时,您的列表为空。
一个简单的解决方案是创建传递values
的副本并操纵副本。 ArrayList
有constructor来执行此操作。