Preencher um Array de Objetos com um atributo sorteado Aleatoriamente

Ola gente estou fazendo um trabalho, é um jogo de lógica, e o objetivo inicial dele é preencher um Array
de 4 posições do tipo Cor com valores randômicos [color=red]“SEM REPETIR”[/color] o que no caso
é o meu problema!!!

Eu tenho uma classe Cor, nesta classe cor eu tenho o método VerificaCor que recebe um número de 1 a 8
e retorna uma String com o nome da cor. Em uma outra classe principal que eu vou usar para testar o jogo
eu preciso dentro de um [color=red]FOR[/color] instanciar um arrey de 4 posições do tipo cor e cada objeto
cor precisa receber uma cor aleatória sem repetir, assim criando o array de objetos com as 4 cores diferentes.

  • Classe Cor

[code]public class Cor {
//Atributos
private String nome;
//Construtor
public Cor(String nome){
this.nome = nome;
}
//Métodos
public String getNome(){
return this.nome;
}
public void setNome(String nomeCor){
this.nome = nomeCor;
}

public String verificaCor(int numeroCor){
    if (numeroCor == 1) {
        return "Verde";
    } else if (numeroCor == 2) {
        return "Azul";
    } else if (numeroCor == 3) {
        return "Marrom";
    } else if (numeroCor == 4) {
        return "Rosa";
    } else if (numeroCor == 5) {
        return "Preto";
    } else if (numeroCor == 6) {
        return "Branco";
    } else if (numeroCor == 7) {
        return "Dourado";
    } else {
        return "Lilás";
    }
}

public int[] sortearSemRepetir(){
    int[] n = new int[4];
    boolean b;
    do {
        b = false;
        for (int i = 0; i < n.length; i++) {
            n[i] = (int) (Math.random() * 8 + 1);
        }
        for (int i = 0; i < n.length; i++) {
            for (int j = 0; j < n.length; j++) {
                if (i != j) {
                    if (n[i] == n[j]) {
                        b = true;
                    }
                }
            }
        }
    } while (b);
    return n;
}

public String[] sortearCor(){
int[] n = sortearSemRepetir();
String[] c = new String[n.length];
for(int i=0; i<n.length; i++){
c[i]=verificaCor(n[i]);
}
return c;
}

}[/code]

Eu consegui criar um método que sorteou as 4 cores e não repetiu nenhuma, porém ele ficou
muito grande e pelos testes que ele faz eu percebo que dependendo do caso ela acaba usando
muita memória, uma vez chegou a demorar 2 seg para sortear a cor, o que eu achei muito!!

Precisava duma ajuda, para mudar essa lógica!! Fazer um método que resolva meu problema
de forma mais simples!

Classe Principal - para vocês entenderem como que eu estou fazendo!

[code]public class Principal {

public static void main(String[] args) {
    Cor[] coresSorteadas = new Cor[4];
    for(int i = 0; i < coresSorteadas.length; i++) {
        coresSorteadas[i] = new Cor("");
    }
    System.out.println("===  CORES SECRETAS  ===");        
    String[] c = coresSorteadas[1].sortearCor();       
    for(int i = 0; i < coresSorteadas.length; i++){
        coresSorteadas[i].setNome(c[i]);
        System.out.print("{" + coresSorteadas[i].getNome()+"} ");
    }
}

}[/code]

Deve demorar muito devido à restrição de não-repetição. Por dois motivos:

1-antes de adicionar uma cor você precisa verificar quais já foram sorteados percorrendo todo o array de cores sorteadas.
2-à medida que vão sendo sorteadas cores, sobram cada vez menos cores sorteáveis, ou seja, que poderão ser adicionadas no array de cores sorteadas.

Para acabar com o primeiro problema, você precisaria guardar quais cores já foram sorteadas, assim, você poderia descartar a opção de forma mais rápida (sem percorrer o array pra verificar).
Para acabar com o segundo, você precisa deixar de sortear cores que já foram sorteadas.

É importante notar que, se acabar com o segundo problema, o primeiro é resolvido também, pois se não sortear cores repetidas, não precisará verificar se ela já havia sido sorteada.

Pra fazer isso, sugiro ir excluindo as cores que já foram sorteadas. Digamos que, por exemplo, suas cores estejam em uma lista de 8 posições. Você sorteia um número entre 0 e 7. Digamos que saia o número 4. Então você pega a cor do índice 4, adiciona no seu array de resposta e remove a cor do índice 4 da lista. O próximo número aleatório sorteado deverá ser entre 0 e 6. E assim sucessivamente.

Por favor, ao postar tópicos, não use marcações para ressaltar o óbvio no título como o fato de você ter [Dúvida] ou querer [Ajuda].

Primeiramente, obrigado pela ajuda regis_hideki estou reformulando os métodos de acordo com as suas dicas
e quando terminar eu posto pra mostrar como ficou!

E ViniDodoy desculpa, como é meu primeiro tópico no guj… eu não sabia exatamente como criá-lo!
Não farei mais isso! ^^

  1. Coloque todas as cores num array;
  2. Use o random() para embaralhar o array;
  3. Pegue as 4 primeiras cores do array embaralhado.

Se puder usar classes do java, use o método Collections.shuffle

Gente Obrigado pelas Dicas, consegui fazer de um modo que não repetiu nenhuma vez.
Logo após sortear todas as cores sem repetir o outro método adicionou as respectivas cores…
Segue abaixo o método, para caso alguém tenha a mesma dúvida que eu!!

public int[] sortearSemRepetir(){ int[] n = new int[4]; for (int i = 0; i < n.length; i++) { int c = (int) (Math.random() * 8 + 1); for (int j = 0; j < n.length; ){ if(c==n[j]){ c = (int) (Math.random() * 8 + 1); j = 0; }else{ j++; } } n[i] = c; } return n; }

[quote=ViniGodoy]1. Coloque todas as cores num array;
2. Use o random() para embaralhar o array;
3. Pegue as 4 primeiras cores do array embaralhado.

Se puder usar classes do java, use o método Collections.shuffle[/quote]

embaralhar o array agora fiquei curioso como assim ?