[RESOLVIDO] Problema com randômico repetido em vetor

10 respostas
M

Boa tarde, pessoal eu estou precisando preencher esse segundo vetor chamado novovetor[], com os dados do vetor principal[], de forma randômica e sem repetir. Já tentei de todas as formas criar um laço de repetição para filtrar a repetição e não consigo, apenas consegui criar o código aleatório, segue abaixo o meu código. Se alguém poder me ajudar. Obrigado.

package testes;

import java.util.Random;
public class Vector {
	public static void main(String[] args) {
		Random random = new Random();
		int i=0, j=0; 
		String principal[] = {"joao","jose","marios","breno","roberto"};
		String novovetor [] = new String [principal.length];
		while((i < principal.length)){
			String principaltexto = principal[random.nextInt(principal.length)];
			novovetor[i] = principaltexto;			
			System.out.println(novovetor[i]);
			i++;
		}
	}
}

10 Respostas

freakazoid

mctheus, não acho legal você utilizar o Random para este fim. Acho mais adequado utilizar Collections.shuffle.
Segue exemplo:

public static void main(String[] args) {

		ArrayList nomes = new ArrayList();
		nomes.add("joao");
		nomes.add("jose");
		nomes.add("marios");
		nomes.add("breno");
		nomes.add("roberto");

		System.out.println(nomes);

		Collections.shuffle(nomes);

		System.out.println(nomes);
	}

Pra utilizando o Random toda vez que gerar um numero aleatório vai precisar fazer uma busca para ver se o valor correspondente a aquele índice já não foi inserido, isso é um saco! Se for apenas esta a finalidade use o shuffle :wink:

Abs!

A

O que entendi é que você está usando os valores randômicos como índice para escolha aleatória dos nomes e não quer que esses valores se repitam, porque iria sobrescrever o valor daquele array. é isso?

um erro que encontrei:

String principaltexto = principal[random.nextInt(principal.length)];

Você colocou como escopo o tamanho do array que é 5, caso seja escolhido este número você irá receber uma exceção por está tentando acessar um índice que não existe, pois seu array tem 5 posições que vai de 0 a 4.

tente:

String principaltexto = principal[random.nextInt(principal.length-1)];
andrews360
import java.util.Random;

public class Vector {
	public static void main(String[] args) {
		Random random = new Random();  
        int i=0;
        String principal[] = {&quot;joao&quot;,&quot;jose&quot;,&quot;marios&quot;,&quot;breno&quot;,&quot;roberto&quot;};  
        String novovetor [] = new String [principal.length];  
        while(i &lt; principal.length){  
            String principaltexto = principal[random.nextInt(principal.length)];
            
           if(verifica(novovetor, principaltexto)== false){
              novovetor[i] = principaltexto;
              System.out.println(novovetor[i]);  
              i++;              
           } 
        }
     
	}
	// Verifica se existe o elemento no vetor 
    public static boolean verifica(String[] vetor, String nome){
    	for (int i = 0; i &lt; vetor.length; i++) {
    		if(vetor[i]==null)
				return false;
			if(vetor[i].equals(nome))
				return true;
			
		}
    	 return false;
    }
    
}
A

Ops, esquece o que escrevi!

new Random().nextInt(5) // gera valores aleatórios entre 0 e 4.

neste ponto sua implementação está correta.

freakazoid

O problema que fazer isso com Random e ainda garantir não haverá valores repetidos é muito custoso. Digamos que o vetor tenha 100 nomes, quantos ifs o código vai executar?
Aumentando um pouco a escala, imagine com 1000… por questões de desempenho o shuffle é melhor, pois pelo que entendi a necessidade é apenas embaralhar os valores.

Abs!

A

Rodei o código do mctheus e gera nomes repetidos no novo array e acho que ele não deseja isso, e pela forma(código) que está fazendo acredito que não conhece ou não pode usar(restrição do professor) toda a facilidade da API Java.
Acho que a implementação do andrews360 deve ter solucionado o problema.

Concordo com você

andrews360

como o freakazoid disse é verdadeira mente custoso fazer isso ainda mais porque o random pode gerar varias vezes o mesmo índice mais para fins didático funciona bem

M

Pessoal, o fato é que não conhecia o shuffle msm rsrsrs.
Eu sou totalmente noob em programação, estou cursando o 7º periodo de programação, e até então só focava no setor de TI, agora que estou tomando gosto pela programação =D

Eu consigo, pegar a posição dos itens, pra utiliza-los posteriormente, com o arraylist ?

Obrigado a todos. Principalmente aos amigos, que ofereceram duas formas diferentes pra resolver o problema. =D

andrews360
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
   public static void main(String[] argv){
      String[] nome = {"joao","jose","marios","breno","roberto"};
      List&lt;String&gt; list = new ArrayList&lt;String&gt;();
      for (int i = 0; i &lt; nome.length; i++) {
		list.add(nome[i]);
	  }
      Collections.shuffle(list);
      System.out.println(list);
   }   
}
M
list.get(0);

descobri aqui googleando! =D

Criado 4 de março de 2013
Ultima resposta 4 de mar. de 2013
Respostas 10
Participantes 4