2016-04-06 3 views
0

У меня есть массив колоды из 52 карт.Как сортировать элементы в массиве

Я хотел бы иметь метод, с помощью которого можно смешивать карты после стратегического размещения карт.

Сначала я разделить карты в пакеты, как это:

Card[] packetOne = new Card[cards.length/2]; 
    Card[] packetTwo = new Card[cards.length/2]; 

    for (int i = 0; i < (cards.length/2); i++) { 

     packetOne[i] = cards[i]; 

    } 

    for (int i = 0; i < packetTwo.length; i++) { 

     for (int c = cards.length/2; c < cards.length; c++) { 

      packetTwo[i] = cards[c]; 

     } 

    } 

Теперь, что карты на две кучу, я хотел бы, чтобы отсортировать карты в новом массиве, так что: первую карту в пакете один - первый, а затем первая карта в пакете два, а затем вторая карта в пакете 1 и после этой карты вторая карта в пакете два и т. д. и т. д. и т. д. до тех пор, пока все карты не будут выполнены.

Также, если количество карт в колоде в любое время нечетное, первый пакет будет иметь еще одну карту, чем второй пакет, но та же самая идея сортировки.

Кто-нибудь знает, как это сделать?

ответ

1
Card[] sortedPacket = new Card[cards.length]; 

int i = 0; 
for (int j = 0; j < cards.length/2 ;j++) { 
    if (packetOne[j] != null) { 
     sortedPacket[i++] = packetOne[j]; 
    } 
    if (packetTwo[j] != null) { 
     sortedPacket[i++] = packetTwo[j]; 
    } 
} 

Это будет цикл для каждого номера элемента в packetOne/packetTwo, добавив в порядке указанных вами

+0

будет ли это работать, если есть нечетное количество карт? если есть нечетное число, первый пакет должен иметь еще одну карточку, чем второй пакет. – user1664285

+0

Второй оператор 'if' в' for' будет гарантировать, что для окончательных карт, если packetTwo пуст, а packetOne - нет, нет ошибки будут выброшены. –

1

Я хотел бы использовать 3 индексы, например:

Card[] array3 = new Card[cards.length]; 
int i1 = 0; 
int i2 = 0; 
int i3 = 0; 
while (i3 < array3.length) { 
    array3[i3++] = packetOne[i1++]; 
    array3[i3++] = packetTwo[i2++]; 
} 

Это может быть сделано с одним индексом, но, сопоставляя индексы с массивами, подобными этому, и используя ++ по правому индексу каждый раз, когда вы читаете/пишете, гораздо легче понять, что это правильно.

Редактировать

Если исходный пакет может содержать нечетное или четное количество карт, вы получили длину packetOne неправильно, потому что n/2 раундов вниз. Это немного сложнее, но все же с помощью системы сопоставления индексов для массивов, все это становится:

Card[] packetOne = new Card[(cards.length + 1)/2]; 
Card[] packetTwo = new Card[cards.length/2]; 
int i = 0, i1 = 0, i2 = 0; 
while (i1 < packetOne.length) { 
    packetOne[i1++] = cards[i++]; 
} 
while (i2 < packetTwo.length) { 
    packetTwo[i2++] = cards[i++]; 
} 
Card[] array3 = new Card[cards.length]; 
int i3 = i1 = i2 = 0; 
while (i3 < array3.length) { 
    array3[i3++] = packetOne[i1++]; 
    if (i3 < array3.length) { 
     array3[i3++] = packetTwo[i2++]; 
    } 
} 
2

Если вы используете Java 8, то есть хороший простой способ сделать это с помощью потоков:

Card[] combinedPack = IntStream.range(0, cards.length/2).boxed() 
    .flatMap(i -> Stream.of(packetOne[i], packetTwo[i])) 
    .toArray(Card[]::new); 

Это создает поток индексов, сопоставляет их новым потокам карт с каждого пакета и затем преобразует обратно в массив.

Смежные вопросы