Java 如何对数组中的项进行排序

Java 如何对数组中的项进行排序,java,Java,我有一组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]; }

我有一组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];

        }

    }
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++];
}
Card[]packetOne=新卡[cards.length/2];
卡片[]packetTwo=新卡片[cards.length/2];
对于(int i=0;i<(cards.length/2);i++){
卡片[i]=卡片[i];
}
对于(int i=0;i
现在这些卡片已经分为两堆,我想把它们排列成一个新的数组,这样:第一包中的第一张卡片是第一张,之后是第二包中的第一张卡片,之后是第一包中的第二张卡片,在这张卡片之后是第二包中的第二张卡片,以此类推,直到所有卡片都完成为止

此外,如果卡片组中的卡片数量在任何时候都是奇数,则第一个数据包将比第二个数据包多出一张卡片,但排序思路相同

有人知道怎么做这类事情吗?

Card[]sortedPacket=新卡[cards.length];
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];
    }
}
int i=0; 对于(int j=0;j
这将为packetOne/packetTwo中的每个元素编号循环,按照您指定的顺序添加

Card[/sortedPacket=new Card[cards.length];
int i=0;
对于(int j=0;j

这将为packetOne/packetTwo中的每个元素编号循环,按照您指定的顺序添加

我将使用3个索引,如下所示:

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

        }

    }
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++];
}

我将使用3个索引,如下所示:

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

        }

    }
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++];
}

如果您使用的是Java 8,那么有一个很好的简单方法可以使用streams实现这一点:

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

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

如果您使用的是Java 8,那么使用流有一个很好的简单方法:

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

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

如果有奇数张卡,这仍然有效吗?如果有奇数,第一个数据包应该比第二个数据包多出一张卡。
for
中的第二个
if
语句将确保对于最后的卡,如果packetTwo为空,而packetOne为空,则不会抛出错误。如果有奇数张卡,这是否仍然有效?如果有奇数,第一个数据包应该比第二个数据包多出一张卡。
for
中的第二个
if
语句将确保对于最后的卡,如果packetTwo为空而packetOne为空,则不会抛出错误。