Condicional com vazio

Bom pessoal estou tentando criar uma função que inicialmente ele deve verificar se o numero randômico esta contido dentro de do vetor criado e dai começa como o vetor e novo ele não tem elemento então eu chamo outra função que direciona este valor para atribuir uma imagem , depois uma nova condição de que se o valor já estiver no vetor ele chama novamente esta mesma função para chamar um numero aleatório e começar novamente a função, eu fiz isso aqui só que ta dando errado. Se alguém puder me auxiliar ai grato ficarei grato.

  public void sorteiaJogadaSemRpetir(View view) {
        int [] valores = {};

        Random numeroRandomico = new Random();
        int valorRandomicoInteiro = numeroRandomico.nextInt(10);

        for (int i = 0; i < valores.length; i++){
            if (valores[i] == valorRandomicoInteiro){
                System.out.println("Valor fora do vetor");
                sorteiaJogada(view);
                valores.add(valorRandomicoInteiro);
            }else{
                sorteiaJogadaSemRpetir(view);
            }
        }
    }

No mundo real, como é que são sorteados números sem repetir?
Coloca todos os números num recipiente e vai removendo aleatoriamente.
Dá uma olhada no Globo da Sorte implementado neste post, deve atender sua necessidade.

O vetor está vazio mesmo. Você não passou nenhum valor pra dentro do valor. E aí como você conta (do verbo contar (1, 2, 3, …)) algo vazio? Não tem como.

Você tem que fazer um if verificando se o vetor tá vazio. Se tiver vazio, então, você não percorre, mas tiver algum valor dentro do vetor você percorre o vetor.

if(valores.length > 0){
     // aí você percorre o vetor.
}

e neste mesmo momento como faço para inserir esse valor randomico dentro do vetor

vetor[posicaoDesejada] = valorDesejado;

Mas tem um porém, você inicializou o array como vazio, e o tamanho de um array não pode ser alterado depois de criado! Então antes de adicionar um valor você deve especificar o tamanho!

Se você não sabe o tamanho ou se ele é variado, pense em utilizar um ArrayList.

array não possuem o método add()!?

Tenta explicar melhor, com algum exemplo, eu não entendi! Pegando a ideia do lucas, Seria isso?

public void sorteiaJogadaSemRpetir(View view) {
        ArrayList<Integer>() valores = new ArrayList<>();

        Random numeroRandomico = new Random();
        int valorRandomicoInteiro = numeroRandomico.nextInt(10);
        
        // A lista tá vazia
        if(valores.isEmpty()){
           sorteiaJogada(view);
           valores.add(valorRandomicoInteiro);
        }
       //A lista não tá vazia, então verifico se o o número já existe!
        else{
           for (int i = 0; i < valores.size(); i++){

                // O número não existe na lista!
               if (valores.get(i) != valorRandomicoInteiro){
                   System.out.println("Valor fora do vetor");
                   sorteiaJogada(view);
                   valores.add(valorRandomicoInteiro);
                   break;
               }else{
                   sorteiaJogadaSemRpetir(view); // aqui ele existe!
                   break;
               }
           }
        }
}

Edit: No ArrayLista já existe um metodo que verifica se um elemento existe na lista:

public void sorteiaJogadaSemRpetir(View view) {
        ArrayList<Integer>() valores = new ArrayList<>();

        Random numeroRandomico = new Random();
        int valorRandomicoInteiro = numeroRandomico.nextInt(10);
           
        //ele não existe na lista!
        if (!valores.contains(valorRandomicoInteiro)){
                System.out.println("Valor fora do vetor");
                sorteiaJogada(view);
                valores.add(valorRandomicoInteiro);
         }else{ 
                sorteiaJogadaSemRpetir(view);
         }
}

Método recursivo para sortear valores entre 0 e 9 sem repetir?
Já pararam pra pensar quantas vezes esse método será executado?
Façam uma lista com os números de 0 à 9 e vão removendo os números aleatoriamente, simples assim.

1 curtida

Verdade! Não tinha reparado que ia apenas de 0 a 9. Realmente é um desperdício de recurso!

1 curtida

Como reduzir este codigo a final entao alguem pode fazer o codigo

eu tentei fazer aqui mas no meu caso ja preciso ter um vetor com elementos ja pra inseridos, e como ele disse depois ir tirando um elemento a medida que eu sortear um novo numero randomico lembrando que eu ativo essa função por um botao pra gerar este numero randomico.

Deu uma olhada no link que postei lá em cima?

Considere a classe abaixo:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class GloboDaSorte {

    private List<Integer> numeros = new ArrayList<>();

    public GloboDaSorte(int de, int ate) {
        for (int numero = de; numero <= ate; numero++) {
            numeros.add(numero);
        }
    }

    public int sortear() {
        if (numeros.isEmpty()) {
            throw new IllegalStateException("Todos os números já foram sorteados!");
        }
        Random random = new Random();
        int sorteado = random.nextInt(numeros.size());
        return numeros.remove(sorteado);
    }

    public boolean podeSortear() {
        return !numeros.isEmpty();
    }
}

Você pode utilizar ela para sortear números de um determinado intervalo, sem repetir.

Veja um exemplo sorteando números de 0 à 9:

GloboDaSorte numeros = new GloboDaSorte(0, 9);
while (numeros.podeSortear()) {
    int numero = numeros.sortear();
    System.out.println(numero);
}