Misturar elementos de uma array de Objetos

8 respostas Resolvido
H

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!

8 Respostas

staroski

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));
H

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.

staroski
Solucao aceita

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;
}
H

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!

staroski

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

H

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

H

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!

H

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

Criado 14 de novembro de 2019
Ultima resposta 15 de nov. de 2019
Respostas 8
Participantes 2