HOWTO · Java

Baralho de cartas embaralhado em Java

Este artigo apresenta como embaralhar um baralho de cartas em Java.

A palavra embaralhar significa literalmente organizar os elementos, objetos ou cartas em ordem aleatória ou indefinida. A lista de objetos que não segue um padrão definido é considerada embaralhada.

Da mesma forma, em Java, vários métodos permitem que um usuário embaralhe elementos. Abaixo está o bloco de código para demonstrar esse processo.

Embaralhe o ArrayList usando o loop tradicional em Java

import java.util.ArrayList;

public class Main {
  private static final int SIZE_OF_DECK = 52;

  public static void main(String[] args) {
    ArrayList<Integer> cardsDeck = new ArrayList<>();
    for (int i = 0; i < SIZE_OF_DECK; ++i) {
      cardsDeck.add(i);
    }
    System.out.println("Deck Of Cards:" + cardsDeck);
    ArrayList<Integer> shuffledDeck = new ArrayList<>();
    while (cardsDeck.size() > 0) {
      int index = (int) (Math.random() * cardsDeck.size());
      int removedCard = cardsDeck.remove(index);
      shuffledDeck.add(removedCard);
    }
    System.out.println("Shuffled Cards" + shuffledDeck);
  }
}

No código acima, uma ArrayList é instanciada. A instância criada ajuda a adicionar elementos ao ArrayList. A lista é preenchida em ordem sequencial de valores 0 a 51. O tamanho do deck é uma variável estática declarada no nível da classe.

O loop for verifica a condição, em que o valor inicial é verificado com a variável de tamanho do deck estático. Agora, para embaralhar a lista inicial, outra ArrayList vazia é criada. Aplicaremos um loop while com uma condição em que o tamanho do deck deve ser maior que o valor zero.

A ideia de manter essa condição é porque o elemento de um baralho é removido e colocado em outra lista embaralhada. Conseqüentemente, o tamanho original continua diminuindo e, finalmente, torna-se zero.

Dentro do loop, usamos a função random para encontrar o índice primeiro. O método estático está presente na classe Math e é chamado diretamente pelo nome da classe. A função de utilidade gera um número aleatório que varia entre 0.0 e 1.0. O método sempre retorna um valor duplo.

Para calcular o valor index, o número aleatório formado é multiplicado pelo tamanho atual da lista do array. Conseqüentemente, gerando um índice aleatório a cada vez.

Agora, o índice formado é usado para remover o elemento do índice no baralho original. O método remove é da classe ArrayList e remove o valor particular no índice. Leva o índice ou a posição na lista para ser removido.

A função também retorna o elemento no índice da lista. O objeto a ser removido é adicionado à nova lista embaralhada. O loop continua, onde um elemento agora reduz o tamanho do deck original. Portanto, quando itera da próxima vez, um novo índice será gerado. E a cada vez, um valor é removido e anexado na lista embaralhada.

Abaixo está a saída do bloco de código fornecido.

Deck Of Cards:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
Shuffled Cards[51, 34, 28, 47, 14, 49, 42, 50, 26, 0, 44, 43, 2, 36, 30, 8, 46, 11, 21, 23, 7, 4, 33, 41, 32, 1, 20, 3, 10, 18, 6, 40, 29, 24, 31, 13, 45, 39, 22, 15, 27, 48, 9, 5, 25, 12, 38, 35, 37, 17, 16, 19]

Embaralhe a ArrayList usando a função shuffle das coleções em Java

Abaixo está o bloco de código que demonstra o embaralhamento usando o método shuffle.

import java.util.ArrayList;
import java.util.Collections;

public class Main {
  public static void main(String[] args) {
    int deckSize = 52;
    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < deckSize; ++i) {
      list.add(i);
    }
    System.out.println("Sequential List: " + list);
    Collections.shuffle(list);
    System.out.println("Shuffled List: " + list);
  }
}

No bloco de código, o procedimento de instanciação ArrayList é o mesmo. A adição de elementos na lista é feita de forma semelhante à do primeiro código. Imprimimos a lista ordenada no console usando o método println.

Agora, a função shuffle de Collections é chamada. Este método realiza a permutação e calcula aleatoriamente os valores na lista fornecida. Esta função coloca o elemento selecionado aleatoriamente de volta na lista. Ele lança o UnsupportedOperationException quando a lista fornecida não suporta a operação de definição. A lista formada aleatoriamente é impressa no console junto com as listas originais.

Sequential List[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51]
Shuffled List[46, 5, 4, 0, 19, 11, 13, 21, 1, 38, 36, 29, 31, 35, 48, 22, 49, 6, 14, 51, 3, 47, 16, 12, 42, 27, 50, 40, 26, 30, 33, 9, 43, 39, 2, 10, 28, 44, 8, 24, 41, 32, 25, 45, 34, 7, 23, 15, 18, 20, 37, 17]