Java用一个数组填充多个数组

时间:2014-02-05 04:05:48

标签: java arrays loops

我有一个阵列,其中包含一副牌中的所有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次随机卡。如何修复我的循环,以便用不同的卡填充数组?

enter image description here

5 个答案:

答案 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)

只需分配数组,如下所示

            if(j <= 13)
            {
                row1[j] = card[j];
                j++;
            }

来自Arrays.fill

的文档
  

将指定的布尔值分配给指定的布尔数组的每个元素。