我有一个阵列,其中包含一副牌中的所有52张牌。
ImageIcon[] cards = {aceSpadesIcon, twoSpadesIcon, ... }
然后我洗了那个数组
for(int i = 0; i < cards.length; i++)
{
int r = (int)(Math.random()*(i+1));
ImageIcon swap = cards[r];
cards[r] = cards[i];
cards[i] = swap;
}
现在我制作了四个新阵列来填充卡阵列。
ImageIcon[] row1 = new ImageIcon[13];
ImageIcon[] row2 = new ImageIcon[13];
ImageIcon[] row3 = new ImageIcon[13];
ImageIcon[] row4 = new ImageIcon[13];
现在我用现在的随机卡阵列填充这些数组
int j = 0;
while(j < cards.length)
{
if(j <= 13)
{
Arrays.fill(row1, cards[j]);
j++;
}
else if(j <= 26)
{
Arrays.fill(row2, cards[j]);
j++;
}
else if(j <= 39)
{
Arrays.fill(row3, cards[j]);
j++;
}
else
{
Arrays.fill(row4, cards[j]);
j++;
}
}
然后我在摇摆窗口中显示它但我有一些错误。我应该有4行,每行有13个不同的随机卡,但我得到4行,每个行显示13次随机卡。如何修复我的循环,以便用不同的卡填充数组?
答案 0 :(得分:2)
使用System.arraycopy填充行:
public static void main(String[] args) {
Integer[] allCards = new Integer[52];
for (int i = 0; i < allCards.length; i++) {
allCards[i]=i;
}
List<Integer> cardList = new ArrayList<Integer>(Arrays.asList(allCards));
Collections.shuffle(cardList);
Integer[] cards = cardList.toArray(allCards.clone());
Integer[] row1 = new Integer[13];
Integer[] row2 = new Integer[13];
Integer[] row3 = new Integer[13];
Integer[] row4 = new Integer[13];
int index = 0;
System.arraycopy(cards, index, row1, 0, 13);
index+=13;
System.arraycopy(cards, index, row2, 0, 13);
index+=13;
System.arraycopy(cards, index, row3, 0, 13);
index+=13;
System.arraycopy(cards, index, row4, 0, 13);
System.out.println(Arrays.toString(cards));
System.out.println(Arrays.toString(row1));
System.out.println(Arrays.toString(row2));
System.out.println(Arrays.toString(row3));
System.out.println(Arrays.toString(row4));
}
答案 1 :(得分:0)
检查javadoc Arrays.fill
它将所有数组的元素设置为指定值。
你需要的是row1 [j] = cards [j],依此类推。
顺便说一句,如果我是你,我会在循环设置row1 [j] = cards [j],row2 [j] = cards [j + 13]等中迭代13次,因为这样可以更清楚地显示你的意图。
答案 2 :(得分:0)
来自Java SE 7文档:
fill
public static void fill(Object[] a,
Object val)
Assigns the specified Object reference to each element of the specified array of Objects.
Parameters:
a - the array to be filled
val - the value to be stored in all elements of the array
Throws:
ArrayStoreException - if the specified value is not of a runtime type that can be stored in the specified array
所以你正在做的是(反复地)用一个值填充每个数组。你想要的将是更多的东西:
while(j < cards.length)
{
if(j < 13)
{
row1[j] = cards[j];
}
else if(j < 26)
{
row2[j%13] = cards[j];
}
else if(j < 39)
{
row3[j%13] = cards[j];
}
else
{
row4[j%13] = cards[j];
}
j++;
}
这仍然非常混乱(如果可能的话,尽量避免使用硬编码的常量),但至少它会做你想要做的事情。请注意,您的原始数组应该是0索引的,因此您的逻辑应该转换为1。另外,请尝试避免重复的代码(注意增量仅发生一次,因为它通过循环的所有通道都是通用的。)
答案 3 :(得分:0)
不要使用Arrays.fill
,即使用您提供的值填充整个数组。尝试这样的事情:
for (int j = 0; j < cards.length; j++)
{
if(j < 13)
{
row1[j] = cards[j];
}
else if(j < 26)
{
row2[j - 13] = cards[j];
}
else if(j < 39)
{
row3[j - 26] = cards[j];
}
else
{
row4[j - 39] = cards[j];
}
}
答案 4 :(得分:0)