Misturar elementos de uma array de Objetos

Bom dia.

Meu programa tem uma array do tipo Cartas:

Cartas baralho = new Cartas[52]

Em um certo momento eu adiciono 52 cartas ao baralho.

Eu quero conseguir embaralhar as cartas antes de exibir na tela.

Eu tentei usar Collections.Shuffle(baralho)

Mas dá um erro dizendo que Collections.Shuffle não suporta baralho.

Como faço para misturar os elementos de uma array do tipo Cartas?

Obrigado!

Não, ele dá um erro dizendo que o método shuffle não aceita um array de Baralho.

O método shuffle espera receber um List.

Se você não puder utilizar List então você pode implementar um método para embaralhar um array, conforme o exemplo abaixo:

public static int[] shuffleArray(int[] array) {
    Random random = new Random();
    int quantidade = array.length;
    for (int i = 0; i < quantidade; i++) {
        int posicao = random.nextInt(quantidade);
        int troca = array[i];
        array[i] = array[posicao];
        array[posicao] = troca;
    }
    return array;
}

Exemplo de uso:

int[] meuArray = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };

System.out.println("Antes de embaralhar:");
System.out.println(Arrays.toString(meuArray));

shuffleArray(meuArray);

System.out.println("Depois de embaralhar:");
System.out.println(Arrays.toString(meuArray));
3 curtidas

Uma das coisas que está me confundindo é que estou abstraindo um baralho. Então imaginei o baralho como uma coleção de cartas. Logo, baralho tem que ser uma estrutura de dados que vai receber 52 elementos do tipo Carta.

Depois eu preciso embaralhar esse baralho.

Por fim eu preciso exibir o baralho embaralhado.

Eu já consegui criar as cartas e criar o baralho.

Falta embaralhar e mostrar.

Tô me confundindo com o tipo Carta. Por enquanto meu baralho é uma array simples. Acho que array não serve pra esse problema.

Serve sim, ao invés de fazer um array de int, você fará um array de Carta.

Basta alterar o código do método shuffleArray para ser assim:

public static Carta[] shuffleArray(Carta[] array) {
    Random random = new Random();
    int quantidade = array.length;
    for (int i = 0; i < quantidade; i++) {
        int posicao = random.nextInt(quantidade);
        Carta troca = array[i];
        array[i] = array[posicao];
        array[posicao] = troca;
    }
    return array;
}
1 curtida

Eu li ontem de madrugada sua sugestão e não havia entendido. Mas devia ser o sono! Eu li novamente e agora entendi. Eu só não tenho como testar agora porque estou no trabalho.

Eu quero checar se o baralho não vai ter cartas repetidas. Quando eu estava em casa bolando uma forma de fazer usando o Random eu imaginei um possível problema: Random gera números aleatórios, porém não garante que não se repitam. Aí pensei que poderia gerar um baralho com cartas repetidas.

Se usando Random não ficar legal vou mudar para uma List. Assim posso usar o método Shuffle.

Mais tarde eu reporto como ficou.

Muito obrigado pela ajuda!

Você não deve usar o Random para gerar as cartas, o Random será usado para embaralhar as cartas já existentes.

tem razão. entendi. as cartas já estão criadas. nem tinha me ligado. vlw!

que vacilo meu. fiquei preso num detalhe que nem era real. não sei porque achei que o random iria bagunçar a criação das cartas.

eu já até deixei a responsabilidade de criar as cartas em outro objeto… não teria como esse método bagunçar isso. obrigado!

Consegui finalizar o exercício. Muito obrigado! Ajudou demais mesmo!

1 curtida