2015-04-21 6 views
3

Я пытаюсь использовать массив из 52 объектов (Карты с костюмами и значениями) и создать массив, содержащий те же 52 объекта, но несколько раз. (Как будто у меня было несколько колод из 52 карт в одной большой колоде).Как заполнить массив объектами из другого массива (Java)

Мой конструктора по умолчанию для заполнения массива из одной колоды выглядит следующим образом:

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'] (https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang .Object-int-int-) – MadProgrammer

ответ

3
int repetitions; 

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

yup, your right – Paul

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])); 
4

В 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 в позиции от 0 до 51 и вторую итерацию в позиции 52-103 в массиве cards.

Ваши объекты Card, вероятно, должны быть неизменными, поэтому нет необходимости создавать новые копии Card каждый раз. Ссылка на те же 52 объекта должна быть быстрее и меньше памяти.