Como implementar isso?

11 respostas
fajohann

Olá, estou criando um Histograma no qual devo registrar o número de ocorrências de valores inteiros dentro de uma faixa de 100 valores.

Por exemplo, se eu registrar os valores :

1 3 3 2 5 6 8 6 4 6 8 3 1 2 0

Deve imprimir

0 : 1 ocorrência
1 : 2 ocorrências
2 : 2 ocorrências
3 : 3 ocorrências
4 : 1 ocorrência
5 : 1 ocorrência
6 : 3 ocorrências
7 : 0 ocorrências
8 : 2 ocorrências
9 : 0 ocorrências
.
.
99: 0 ocorrências

Na minha classe de teste está gerando isso :

REGISTRADOS
1 1 1 1 1 1 1 1 2 3 3 3 5 6 7
1-> 8 Ocorrencias
2-> 1 Ocorrencias
3-> 3 Ocorrencias
5-> 1 Ocorrencias
6-> 1 Ocorrencias
7-> 1 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias

Segue abaixo o código da implementação :

public class TesteVetorRepet
{
   
  private int inicio;
  private int quantidade = 1;
  private int posicao = 0;
  private int[] vNumerosLidos = new int[100];
  private int[] vNumerosRepetidos = new int[100];
  private int[] vTotalRepeticoes = new int[100];
  private int[] vtotal = new int[1];
  private int iTotalRepetidos, i, j, aux;
  private  boolean achouRepetido;
      
  public TesteVetorRepet()
  {
    this.inicio = 1;
  }
    
  void registrar(int valor)
  {
    //cria um novo array conforme vai add elementos  
    int[] temp = new int[quantidade];  
    
    // add os elementos de total no novo array   
    for (int i = 0; i < vtotal.length; i++) {
      temp[i] = vtotal[i];  }  
    
    // add o o novo elemento   
    temp[posicao] = valor;  
    
    // repassa para total o novo array   
    vtotal = temp;  
    quantidade++;  
    posicao++;  
  }   
  
  
  void verifica_ocorrencias(int[] v)
  {
    for(i = 0; i < v.length; i++){
   
      vNumerosLidos[i] = v[i];
      /* Aqui começa o trecho que varre os vetores acima criados para ver a quantidade de vezes que se
       * repetem as informações digitadas */
      achouRepetido = false;
      for (j=0; j<v.length; j++){
      
        if  (vNumerosRepetidos[j] == vNumerosLidos[i] ){
          vTotalRepeticoes[j]++;
          achouRepetido = true;
          break;}
      }
      if  (achouRepetido == false){
      
        vNumerosRepetidos[iTotalRepetidos] = vNumerosLidos[i];
        vTotalRepeticoes[iTotalRepetidos]++;
        iTotalRepetidos++;}
    }    
        
    for(i = 0; i < v.length; i++){
      System.out.print(vNumerosLidos[i]);
      System.out.print(" ");
    } 
    System.out.println();
           
    for(i = 0;i< v.length; i++){
      System.out.println (vNumerosRepetidos[i] +  "-> " +   vTotalRepeticoes[i] + "  Ocorrencias "   );
    }
  }   
     
  void ordenar_vetor(int v[], int tamanho)
  {
    int i, j, temp;
   
    for(i = 0; i < tamanho-1; i++){
      
      for(j = 0; j < tamanho-1; j++){
        if(v[j] > v[j + 1]){
          temp = v[j];
          v[j] = v[j + 1];
          v[j + 1] = temp;
        }
      }
    }
  }
  
  void imprimir()
  {
    
     System.out.println("REGISTRADOS");
     for ( i = 0; i < vtotal.length; i++){
       vNumerosLidos = vtotal;
       ordenar_vetor(vNumerosLidos,vtotal.length);
     } 
     verifica_ocorrencias(vNumerosLidos);
     System.out.println();
     
  }
     
  public static void main(String[] args)
  {
    TesteVetorRepet t = new TesteVetorRepet();
    t.registrar(1);
    t.registrar(3);
    t.registrar(3);
    t.registrar(1); 
    t.registrar(1); 
    t.registrar(6);
    t.registrar(5);
    t.registrar(7);
    t.registrar(3); 
    t.registrar(2); 
    t.registrar(1);
    t.registrar(1);
    t.registrar(1);
    t.registrar(1); 
    t.registrar(1); 
    t.imprimir();
  }
}
Notem que ele até gera as ocorrencias certas, mas na hora de imprimir não coloca em ordem de 0 a 99 os valores como no primeiro exemplo acima e esse é meu problema, se alguém puder por favor me ajudar fico agradecido!!

OBRIGADO.

[list][/list]

11 Respostas

thegoergen

Eu acho que na hora de verificar e mostrar na tela, você deve criar um FOR de 0 a 99, e não de 0 até o tamanho do vetor…

fajohann

O problema é que eu acho que eu teria que comparar o vetor que armazena os numeros repetidos com o vetor de conta de 0 a 99 e dai se alguma posição for igual fazer a troca tipo assim :

digamos que :
for (int cont = 0; cont < 100; cont ++){
  vNumerosRepetidos[cont];
  /*numeros que foram registrados por mim e que estão repetidos no caso na posição [0] está armazenado o valor '1' 
  na posição [1] está o valor '3' e assim por diante*/
  
  vtotal[cont];
  // vetor que conta de 0 a 99
}
quando o vtotal[cont] for igual a vNumerosRepetidos[cont] então essa posição do vtotal[cont] tem repetição e a partir dai então mostrar quantas ocorrencias aparece esse valor só que esse é o problema pois não estou conseguindo implementar isso :? Se alguem souber uma dica ai por favor me ajude !!!
fajohann

Eu não to pedindo pra fazerem pra mim só queria uma ajuda…

rafaeldiego

bom dia…

cara, se eu entendi, voce pode fazer o seguinte:

depois q tiver com o vetor que contem os numeros (ex: 0, 2, 3, 6, 4, 1, 0, 0, 2, 6, 5), aí vc faz um for de 0 até o tamanho do vetor que vc tem;

1º - pega o 1º elemento (no caso, 0), guarda numa variavel (ex: numdavez);

cria um contador inteiro (cont);

percorre o vetor, pelo for;

cada vez q o vetor na posicao i for igual a numdavez, vc incrementa o cont;

ao final do for, imrpima qtas vzs numdavez apareceu, pelo cont;

cria um vetor ocorrencias e guarda numdavez;
2º - no proximo loop do for, vc compara se o vetor na posicao i é igual a algum numero do vetor de ocorrencias;

(assim vc nao deixa repetir os numeros)

se nao for igual, vc faz o procedimento nº1 novamente.

assim, vc ira imprimir o numero somente uma vez junto com qtas vzs apareceu.

vc pode criar uma matriz[][] e guardar o numero da vez e qtidade de correncias, depois ordenar.

se compliquei mais, foi mal! :lol:

ViniGodoy
rafaeldiego:
vc pode criar uma matriz[][] e guardar o numero da vez e qtidade de correncias, depois ordenar.

se compliquei mais, foi mal! :lol:

Se numDaVez variar muito (por exemplo, você tiver ao mesmo tempo 1, 10, 1000, 10000) não fica prático criar uma matriz. Nesse caso, crie um Map:
Map<Integer, Integer>.

Aliás, com um map também é possível fazer a lógica da contagem. Basta percorrer o seu vetor e somar no mapa. Observe:

int numeros = { 0, 2, 3, 6, 4, 1, 0, 0, 2, 6, 5};
//Mapeamos o número para quantas vezes ele apareceu
//O TreeMap já será ordenado pela sua chave, no caso, o número.
Map<Integer, Integer> contagem = new TreeMap<Integer, Integer>();

for (int numero : numeros) {
    Integer num = contagem.get(numero);
    if (num == null) //Nunca foi inserido no mapa?
        contagem.put(numero, 1); //Então é a primeira vez que numero aparece
    else //caso contrário
         contagem.put(numero, num+1); //Somamos um ao número de vezes que o número já apareceu.
}

//Agora podemos imprimir os elementos.
for (Map.Entry<Integer, Integer> tupla : contagem.entrySet()) {
    System.out.println(tupla.getKey() + ": " + tupla.getValue());
}

PS: Não testei o código, pode conter um errinho ou outro, mas a lógica em si é essa.

fajohann

Bom dia.

Rafael, se eu entendi oq vc quis dizer eu ja fiz isso no meu código
Vc chegou a ver ele ?

eu criei um método chamado verifica_ocorrencias

que ficou assim:

void verifica_ocorrencias(int[] v)
  {
    for(i = 0; i < v.length; i++){
   
      vNumerosLidos[i] = v[i];
      /* Aqui começa o trecho que varre os vetores acima criados para ver a quantidade de vezes que se
       * repetem as informações digitadas */
      achouRepetido = false;
      for (j=0; j<v.length; j++){
      
        if  (vNumerosRepetidos[j] == vNumerosLidos[i] ){
          vTotalRepeticoes[j]++;
          achouRepetido = true;
          break;}
      }
      if  (achouRepetido == false){
      
        vNumerosRepetidos[iTotalRepetidos] = vNumerosLidos[i];
        vTotalRepeticoes[iTotalRepetidos]++;
        iTotalRepetidos++;}
    }    
        
    for(i = 0; i < v.length; i++){
      System.out.print(vNumerosLidos[i]);
      System.out.print(" ");
    } 
    System.out.println();
           
    for(i = 0;i< v.length; i++){
      System.out.println (vNumerosRepetidos[i] +  "-> " +   vTotalRepeticoes[i] + "  Ocorrencias "   );
    }
  }

esse método na hora de testar o programa
quando eu criar o meu vetor de registros no caso criei
(1, 3 , 3 , 1 , 1 , 6 , 5 , 7 , 3 , 4 , 1 , 1 , 1 , 1 , 1)

ele vai imprimir na tela o seguinte :

REGISTRADOS
1 1 1 1 1 1 1 1 3 3 3 4 5 6 7
1-> 8 Ocorrencias
3-> 3 Ocorrencias
4-> 1 Ocorrencias
5-> 1 Ocorrencias
6-> 1 Ocorrencias
7-> 1 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias
0-> 0 Ocorrencias

Só que oq eu precisava era que imprimisse assim :

[color=red]0[/color] -> 0 ocorrencias
[color=red]1[/color] -> 8 ocorrencias
[color=red]2[/color] -> 0 ocorrencias
[color=red]3[/color] -> 3 ocorrencias
[color=red]4[/color] -> 1 ocorrencias
.
.
[color=red]99[/color] -> 0 ocorrencias

com a método do Map deu a mesma coisa que meu código gera =/

A

Amigo, reescrevi seu código. Creio que continham algumas coisas desnecessarias.
Espero ter ajudado e tenha alcançado o resultado esperado.

Com este código o resultado foi:
1-> 8 Ocorrencias
2-> 1 Ocorrencias
3-> 3 Ocorrencias
5-> 1 Ocorrencias
6-> 1 Ocorrencias
7-> 1 Ocorrencias

Usei a interface SortedMap que poupa muito trabalho.

package main;

import java.util.*;

public class Main
{
	private SortedMap<Integer,Integer> numeros;

	public Main()
	{
		numeros=new TreeMap<Integer,Integer> ();
	}

	void registrar(int valor)
	{
		Integer aux=numeros.get(valor);
		if (aux==null)
			numeros.put(valor, 1);
		else
			numeros.put(valor, aux+1);
	}


	void imprimir()
	{
		Object[] chaves =numeros.keySet().toArray();
		Object[] valores=numeros.values().toArray();
		for (int i=0;i<chaves.length;i++) {
			System.out.println (chaves[i] +  "-> " +   valores[i] + "  Ocorrencias "   );
		}
	}

	public static void main(String[] args)
	{
		Main t = new Main();
		t.registrar(1);
		t.registrar(3);
		t.registrar(3);
		t.registrar(1);
		t.registrar(1);
		t.registrar(6);
		t.registrar(5);
		t.registrar(7);
		t.registrar(3);
		t.registrar(2);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.imprimir();
	}
}
fajohann

Baaa valeu !!!
Bem mais simples esse teu método.

Mas mesmo assim ainda não é oq eu preciso pois na hora de imprimir o resultado tem q ser

0 -> 0 ocorrencias
1 -> 8 ocorrencias
2 -> 0 ocorrencias
3 -> 3 ocorrencias
4 -> 1 ocorrencias
.
.
99 -> 0 ocorrencias

é tipo assim…eu tenho uma faixa que vai de 0 a 99 e dai então os numeros que eu registrei eu tenho q verificar quantas ocorrencias o numero aparece dentro dessa faixa…mas eu tenho que mostrar toda a faixa do 0 ao 99 e então os numeros q não tiverem ocorrencia fica em 0 e os q tiverem dai mostrar o respectivo numero de ocorrencias, como citado acima, entendeu ? Será que vc n tm uma idéia de como eu consigo fazer isso ?

Obrigado pela ajuda !

A

Mais simples ainda então:

package main;

public class Main
{

	private int numeros[];

	public Main()
	{
		numeros = new int[100];
		for (int i=0;i<100;i++) {
			numeros[i]=0;
		}
	}

	void registrar(int valor)
	{
		numeros[valor]++;
	}


	void imprimir()
	{
		for (int i=0;i<numeros.length;i++) {
			System.out.println (i +  "-> " +   numeros[i] + "  Ocorrencias "   );
		}
	}

	public static void main(String[] args)
	{
		Main t = new Main();
		t.registrar(1);
		t.registrar(3);
		t.registrar(3);
		t.registrar(1);
		t.registrar(1);
		t.registrar(6);
		t.registrar(5);
		t.registrar(7);
		t.registrar(3);
		t.registrar(2);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.registrar(1);
		t.imprimir();
	}
}
A

Ops, esqueci da comparação para testar se o numero esta entre 0 e 99 no metodo que registra.

fajohann

Baaa não acredito que era tão fácil !!! hehehe q burro eu sou kkkkkk

Valeu aí Alisson…brigadão mesmo !

Criado 15 de maio de 2008
Ultima resposta 16 de mai. de 2008
Respostas 11
Participantes 5