Просто, чтобы уточнить, звучит так, как если бы вы захотели перемешать, расположив цифры
1 2 3 4 5 6 7 8
как
1 8 2 7 3 6 4 5
.
Самый эффективный способ сделать это - создать новый массив, так как замена элементов на месте не легка и не будет быстрой. Ключевое наблюдение в этом паттерне заключается в том, что каждый четный элемент (начиная с индекса 0, поэтому первый элемент является четным) отсчитывает вверх от начала колоды, а нечетный элемент отсчитывает назад от конца колоды.
Используя эту информацию, мы можем перебрать новый массив, скопировав значения из определенного индекса в исходный массив, основываясь на том, является ли текущий индекс нечетным или четным. Если текущий индекс в нашем новом массиве называется i
, то
- Если
i
является четным, то элемент, который нам нужен, имеет индекс i/2
- Если
i
нечетно, то элемент имеет индекс array.length - (i+1)/2
(+1
округляется до ближайшего четного числа)
Вот код:
public static Card[] rifleShuffle(Card[] deck) {
Card[] newDeck = new Card[deck.length];
for (int i = 0; i < newDeck.length; i++) {
// Check whether current index is odd or even by using mod 2
if (i % 2 == 0) {
newDeck[i] = deck[i / 2];
} else {
newDeck[i] = deck[deck.length - ((i + 1) / 2)];
}
}
return newDeck;
}
public static void main(String[] args) {
Card[] deck1 = new Card[52];
int i = 0;
for (int suite = 0; suite < 4; suite++) {
for (int value = 1; value <= 13; value++) {
deck1[i++] = new Card(value, suite);
}
}
System.out.println("Before shuffling: " + Arrays.toString(deck1));
Card[] deck2 = rifleShuffle(deck1);
System.out.println("After shuffling: " + Arrays.toString(deck2));
}