Contar numeros repetidos ArrayList

Ola…

Estou com mais um problema.

Tenho que percorrer um arraylist e tenho que mostrar os 10 numeros mais repetidos.

Não consegui achar uma lógica boa para isso. Encontrei soluções absurdas.
queria a opnião de vocês para achar a melhor maneira de conseguir contar esses numeros repetidos.

Bem a primeira solução que me veio na cabeça são dois fors ( um interno ao outro ) onde o objetivo é contar a qtd de cada elemento do array .Depois vc ordena o array de resultado pelo valor de repetição ( no caso o array deve conter a qtd de numeros repetidos e o numero ).E pronto , nem precisa falar que essa solução é pessima .Mas foi a primeira que me veio na cabeça.

Supondo que você tem um ArrayList<Integer> de tamanho 1000 chamado numeros.

Map<Integer, Integer> contagem = new HashMap<Integer, Integer>();

//Passo 1: Montar um mapa que associa o valor a quantas vezes ele pareceu
for (int valor : numeros) {
   if (!contagem.contains(valor)) {
       contagem.put(valor, 0);
   }
   contagem.put(valor, contagem.get(valor)+1);
}   

//Passo 2: Criar um TreeSet que ordene pela contagem
Set<Map.Entry<Integer, Integer>> valores = new TreeSet<Map.Entry<Integer, Integer>>(
   new Comparator<Map.Entry<Integer, Integer>>() {
      public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
          return o1.getValue().compareTo(o2.getValue());
      }
   });
valores.addAll(contagem.entrySet());

//Passo 3: Exibir os 10 maiores:
int exibidos = 0;
for (Map.Entry<Integer, Integer> valor : valores) {
   System.out.printf("Número: %d   Vezes: %d", valor.getKey(), valor.getValue());
   exibidos++;
   if (exibidos == 10) break;
}

Aham… Mais estou encontrando alguns erro que não consegui resolver no método "public int compare, no <-- compare esta o erro.

Um método exemplo simples que talvez lhe ajude:

[code] public static void main(String[] args) {

	ArrayList<Integer> numeros = new ArrayList<Integer>();
	numeros.add(10); // 1
	numeros.add(30); // 1
	numeros.add(500); // 1
	numeros.add(40); // 1
	numeros.add(500); // 2
	numeros.add(10); // 2
	numeros.add(30); // 2
	numeros.add(500); // 3
	numeros.add(40); // 2
	numeros.add(500); // 4
	numeros.add(30); // 3
	numeros.add(30); // 4
	numeros.add(10); // 3
	numeros.add(30); // 5
	numeros.add(500); // 5
	numeros.add(40); // 3

	Set<Integer> numerosSemRepeticoes = new HashSet<Integer>(numeros);

	Iterator<Integer> iteradorDeNumerosSemRepeticoes = numerosSemRepeticoes
			.iterator();
	while (iteradorDeNumerosSemRepeticoes.hasNext()) {

		System.out.println(Collections.frequency(numeros,
				iteradorDeNumerosSemRepeticoes.next()));

	} // while

} // main[/code]

Os números comentados é a freqüência que eles existem no ArrayList que coloquei pra facilitar.

EDIT: Explicando
Um Set é uma collection que não aceita elementos repetidos. Quando mandei criar um Set com os valores do ArrayList, todos os valores repetidos são descartados e assim eu obtive uma lista de cada valor existente no ArrayList
Depois, para cada valor existente no ArrayList, eu usei o método Collections.frequency para obter quantas vezes aquele valor aparece no ArrayList

Corrigi ali em cima. Testa lá. É que não tenho Java aqui.

Obrigado… aquele primeiro método resolveu meu problema.
Só mais uma duvida.

E se eu quizesse saber os 10 menos repetidos, como eu faria?

É só inverter o comparador. Ali onde tem o1.compareTo(o2); faça o contrário.

Puts cara… ta foda.

No TreeSet ele está me acusando o seguinte erro ai.

Incorrect number of arguments for type TreeSet<E>; it cannot be parameterized with arguments <Integer, Integer>

eu não entendo nada desse TreeSet, vou procurar saber mais. Mas agora…o que está acontecendo?

Corrigido lá.

Consegui agora… só um problema.

Fiz dois métodos.
Uma para mostrar os dez mais sorteados e outro para mostrar os dez menos sorteados

dez mais sorteados

	//*******************************************Dez Mais sorteados**********************************************************************
	public void dezMaiores()
	{
	
		String selectPrimeiraDezena = "select primeira_dezena from megasena";
		String selectSegundaDezena = "select segunda_dezena from megasena";
		String selectTerceiraDezena = "select terceira_dezena from megasena";
		String selectQuartaDezena = "select quarta_dezena from megasena";
		String selectQuintaDezena = "select quinta_dezena from megasena";
		String selectSextaDezena = "select sexta_dezena from megasena";
	
		try {
			st = con.createStatement();
			ResultSet rs_dezmaiores = st.executeQuery(selectPrimeiraDezena);
			
			while(rs_dezmaiores.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores.getObject("primeira_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);
	
			}
			
			ResultSet rs_dezmaiores1 = st.executeQuery(selectSegundaDezena);
			
			while(rs_dezmaiores1.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores1.getObject("segunda_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);

			
			}
			
			ResultSet rs_dezmaiores2 = st.executeQuery(selectTerceiraDezena);
			
			while(rs_dezmaiores2.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores2.getObject("terceira_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);

			
			}
			
			ResultSet rs_dezmaiores3 = st.executeQuery(selectQuartaDezena);
			
			while(rs_dezmaiores3.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores3.getObject("quarta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);

			
			}
			
			ResultSet rs_dezmaiores4 = st.executeQuery(selectQuintaDezena);
			
			while(rs_dezmaiores4.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores4.getObject("quinta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);

			
			}
	 
			ResultSet rs_dezmaiores5 = st.executeQuery(selectSextaDezena);
			
			while(rs_dezmaiores5.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmaiores5.getObject("sexta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumeros.add(temp3);

			
			}
			
		} catch (SQLException e) {
			
			System.out.println("erro no dez maiores");
			e.printStackTrace();
		}
		
	
		
		Map<Integer, Integer> contagem = new HashMap<Integer, Integer>();   
		  
		//Passo 1: Montar um mapa que associa o valor a quantas vezes ele pareceu   
		for (int valor : todosnumeros) {   
		   if (!contagem.containsKey(valor)) {   
		       contagem.put(valor, 0);   
		   }   
		   contagem.put(valor, contagem.get(valor)+1);   
		}     
		  
		//Passo 2: Criar um TreeSet que ordene pela contagem   
		Set<Map.Entry<Integer, Integer>> valores = new TreeSet<Map.Entry<Integer, Integer>>(    
		   new Comparator<Map.Entry<Integer, Integer>>() {   
		      public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {   
		          return o1.getValue().compareTo(o2.getValue());   
		      }   
		   });   
		valores.addAll(contagem.entrySet());   
		  
		//Passo 3: Exibir os 10 maiores:   
		int exibidos = 0;   
		for (Map.Entry<Integer, Integer> valor : valores) {   
		   System.out.printf("Número: %d   Vezes: %d", valor.getKey(), valor.getValue() );   
		   System.out.println();

		   exibidos++;
		   
		   String temp = valor.getKey().toString();
		   
		   if(exibidos == 1) 
		   {
			   t_n10.setText( temp );
			   t_n10.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 2) 
		   {
			   t_n9.setText( temp );
			   t_n9.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 3)
		   {
			   t_n8.setText( temp );
			   t_n8.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		
		   if(exibidos == 4)
		   {
			   t_n7.setText( temp );
			   t_n7.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 5)
		   {
			   t_n6.setText( temp );
			   t_n6.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 6)
		   {
			   t_n5.setText( temp );
			   t_n5.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 7)
		   {
			   t_n4.setText( temp );
			   t_n4.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 8)
		   {
			   t_n3.setText( temp );
			   t_n3.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		   
		   if(exibidos == 9)
		   {
			   t_n2.setText( temp );
			   t_n2.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 10)
		   {
			   t_n1.setText( temp );
			   t_n1.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
			   if(exibidos == 10) break; 
		   }
		   
		}  

	}

e os dez menos sorteados

	public void dezMenores()
	{
		String selectPrimeiraDezena = "select primeira_dezena from megasena";
		String selectSegundaDezena = "select segunda_dezena from megasena";
		String selectTerceiraDezena = "select terceira_dezena from megasena";
		String selectQuartaDezena = "select quarta_dezena from megasena";
		String selectQuintaDezena = "select quinta_dezena from megasena";
		String selectSextaDezena = "select sexta_dezena from megasena";
	
		try {
			st = con.createStatement();
			ResultSet rs_dezmenores = st.executeQuery(selectPrimeiraDezena);
			
			while(rs_dezmenores.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores.getObject("primeira_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);
	
			}
			
			ResultSet rs_dezmenores1 = st.executeQuery(selectSegundaDezena);
			
			while(rs_dezmenores1.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores1.getObject("segunda_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);

			
			}
			
			ResultSet rs_dezmenores2 = st.executeQuery(selectTerceiraDezena);
			
			while(rs_dezmenores2.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores2.getObject("terceira_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);

			
			}
			
			ResultSet rs_dezmenores3 = st.executeQuery(selectQuartaDezena);
			
			while(rs_dezmenores3.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores3.getObject("quarta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);

			
			}
			
			ResultSet rs_dezmenores4 = st.executeQuery(selectQuintaDezena);
			
			while(rs_dezmenores4.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores4.getObject("quinta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);

			
			}
	 
			ResultSet rs_dezmenores5 = st.executeQuery(selectSextaDezena);
			
			while(rs_dezmenores5.next())
			{
				BigDecimal temp = (BigDecimal) rs_dezmenores5.getObject("sexta_dezena");
				String temp2 = temp.toString();
				int temp3 = Integer.parseInt(temp2);
				todosnumerosmenores.add(temp3);
			
			}
			
		} catch (SQLException e) {
			
			System.out.println("erro no dez maiores");
			e.printStackTrace();
		}
		
	
		
		Map<Integer, Integer> contagem = new HashMap<Integer, Integer>();   
		  
		//Passo 1: Montar um mapa que associa o valor a quantas vezes ele pareceu   
		for (int valor : todosnumerosmenores) {   
		   if (!contagem.containsKey(valor)) {   
		       contagem.put(valor, 0);   
		   }   
		   contagem.put(valor, contagem.get(valor)+1);   
		}     
		  
		//Passo 2: Criar um TreeSet que ordene pela contagem   
		Set<Map.Entry<Integer, Integer>> valores = new TreeSet<Map.Entry<Integer, Integer>>(    
		   new Comparator<Map.Entry<Integer, Integer>>() {   
		      public int compare(Map.Entry<Integer, Integer> o2, Map.Entry<Integer, Integer> o1) {   
		          return o1.getValue().compareTo(o2.getValue());   
		      }   
		   });   
		valores.addAll(contagem.entrySet());   
		  
		//Passo 3: Exibir os 10 maiores:   
		int exibidos = 0;   
		for (Map.Entry<Integer, Integer> valor : valores) {   
		   System.out.printf("Número: %d   Vezes: %d", valor.getKey(), valor.getValue()); 
		   System.out.println();
		   exibidos++;  
		   
		   String temp = valor.getKey().toString();
		   if(exibidos == 1) 
		   {
			   t_mn1.setText( temp );
			   t_mn1.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 2) 
		   {
			   t_mn2.setText( temp );
			   t_mn2.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 3)
		   {
			   t_mn3.setText( temp );
			   t_mn3.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		
		   if(exibidos == 4)
		   {
			   t_mn4.setText( temp );
			   t_mn4.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 5)
		   {
			   t_mn5.setText( temp );
			   t_mn5.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 6)
		   {
			   t_mn6.setText( temp );
			   t_mn6.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		  
		   if(exibidos == 7)
		   {
			   t_mn7.setText( temp );
			   t_mn7.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 8)
		   {
			   t_mn8.setText( temp );
			   t_mn8.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		   
		   if(exibidos == 9)
		   {
			   t_mn9.setText( temp );
			   t_mn9.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
		   }
		 
		   if(exibidos == 10)
		   {
			   t_mn10.setText( temp );
			   t_mn10.setToolTipText("Sorteado " + valor.getValue() + " Vezes");
			   if(exibidos == 10) break; 
		   }   
		}
	}

quando eu coloco para rodar ele chama os dois métodos em um evento de um botão “mostrar resultados”

os dez mais sorteados estão mostrando os seguintes resultados


Número: 26   Vezes: 83
Número: 39   Vezes: 92
Número: 9   Vezes: 93
Número: 22   Vezes: 97
Número: 48   Vezes: 98
Número: 11   Vezes: 99
Número: 2   Vezes: 100
Número: 60   Vezes: 102

por enquanto tudo certo.

mais nos dez menos sorteados.

Número: 41   Vezes: 134
Número: 33   Vezes: 130
Número: 5   Vezes: 129
Número: 42   Vezes: 128
Número: 17   Vezes: 127
Número: 4   Vezes: 126
Número: 24   Vezes: 125
Número: 23   Vezes: 124
Número: 54   Vezes: 123

a quantidade de vezes que os numeros menos sorteados apareceram é bem maior do que a dos numeros mais sorteados.

mudei a parte no compareTo,
será que teria que mudar mais algo?

Aparentemente seus comparadores estão invertidos.

Outra coisa. Dá para criar um método, e passar aquele comparador por parâmetro. Assim você usa o mesmo método para exibir os maiores ou os menores, mudando apenas o comparador.

Aqueles ifs no final, testando se é == 1, == 2, == 3, etc… também tem que ser revistos. Tipicamente, ifs assim não são necessários, principalmente pq o conteúdo deles está praticamente igual.

E pq vc está pegando as dezenas como um BigDecimal? Até onde eu sei, elas se referem mesmo a um número inteiro, inferior a 100. Portanto, um int seria mais rápido, ocuparia menos espaço e seria mais adequado para o seu caso.

AH… é uma boa.

então… estou armazenando como bigdecimal porque eu não consegui jogar do resultset para uma variavel do tipo int.

mais os metédos
vou fazer por parametro, os ifs tabe vou achar uma solução melhor para eles.

Basta usar o método getInt, do resultset.

Valeu mais uma vez cara.
Agora sim consegui deixar com menos gambiarra…