我有一副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];
}
}
既然这些卡分为两堆,我想在一个新阵列中对卡进行排序,以便:第一个包中的第一张卡是第一张,然后是第二张包中的第一张卡,之后是第二张卡在数据包一和此卡之后的第二张卡中的第二张卡等等,直到所有卡都完成。
此外,如果任何时候牌组中的牌数都是奇数,那么第一个数据包将比第二个数据包多一张牌但具有相同的排序想法。
有谁知道如何做这类事情?
答案 0 :(得分:2)
如果您使用的是Java 8,那么使用流可以很容易地实现此目的:
Card[] combinedPack = IntStream.range(0, cards.length/2).boxed()
.flatMap(i -> Stream.of(packetOne[i], packetTwo[i]))
.toArray(Card[]::new);
这会创建一个索引流,将这些索引映射到每个数据包的新流卡中,然后转换回数组。
答案 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中的每个元素编号,按照您指定的顺序添加
答案 2 :(得分: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++];
}
}