2016-04-06 14 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
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

for中的第二个if语句将确保对于最终的卡,如果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); 

这将创建一个索引流,将它们映射到每个数据包的新卡片流,然后转换回数组。

相关问题