如何用Java将一个数组中的对象填充到另一个数组中

4
我将尝试使用一个包含花色和点数的52个对象(卡牌)的数组,并创建一个包含相同52个对象但多次出现的数组。(就像我有多副牌在一起的大牌堆中)。
我的默认构造函数填充一个牌组的数组如下:
public Deck() {
  allocateMasterPack(); //creates and fills the "model" deck
  cards = new Card[masterPack.length];
  for (int i = 0; i < masterPack.length; i++) {
     cards[i] = new Card(masterPack[i]);
  }

我该如何做才能填充一个包含两副牌(104张卡片对象,52张牌的组合重复两次)、三副牌或四副牌的数组?


4
System.arraycopy是Java语言中的一个方法,用于将一个数组的内容复制到另一个数组中。它接受源数组、源数组的起始位置、目标数组、目标数组的起始位置和要复制的元素数量等参数。 - MadProgrammer
3个回答

5
在Java 8中,您可以使用Stream.flatMap()来实现此操作:
int n = 2;
Card[] cards = IntStream.range(0, n)  // repeat n times
                        .mapToObj(i -> masterPack) // replace each i with the masterPack
                        .flatMap(pack -> Arrays.stream(pack)) // turn the Stream<Card[]> into a Stream<Card> by flattening it
                        .toArray(Card[]::new); // create a new array containing all the cards repeated n times

如果无法使用Java 8,您可以使用 System.arraycopy()

arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数:
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素数。

例如,如果您想将 masterPack 复制到新的牌组并使其大小翻倍,可以执行以下操作:

int n = 2;
Card[] cards = new Card[masterPack.length * n];
for (int i = 0; i < n; i++) {
    System.arraycopy(masterPack, 0, cards, i * masterPack.length, masterPack.length);
}

这将循环两次,执行:

System.arraycopy(masterPack, 0, cards, 0, 52);
System.arraycopy(masterPack, 0, cards, 52, 52);

第一次迭代将masterPack元素复制到cards数组的0到51个位置,第二次迭代将它们复制到52到103个位置。
您的Card对象应该是不可变的,因此每次都无需创建新的Card副本。引用相同的52个对象应该更快且占用更少的内存。

3
int repetitions;

for(int i = 0 ; i < masterPack.length * repetitions ; i++)
     cards[i] = new card(masterPack[i % masterPack.length]);

1

尝试在您的纸牌游戏中使用ArrayList。

public Deck() {
int repetitions;     
ArrayList<Card> cards = new ArrayList<Card>();

for (int x = 0; x < repititions; x++)
    for (int i = 0; i < masterPack.length; i++) 
        cards.add(new Card(masterPack[i]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接