Comparação entre Arrays Simples

26 respostas
mario2010

Boa Tarde, estou com o seguinte problema:Criei uma classe que gera jogos da mega-sena(6 numeros) utilizando array simples e um Random(logicamente para gerar os numeros)...A classe funciona perfeitamente, porem, digamos que eu peça para a classe criar 200 jogos..alguns jogos, apresentados são identicos..tipo, dentre um grupo de jogos que eu crio, alguns são repetidos....você podem me ajudar a criar um método para comparar os arrays e verificar se são iguais???

desde ja obrigado e fiko no aguardo...

segue o código:

import java.awt.*;
   import javax.swing.*;


    public class MegaSena
   {
       public static void bubble ( int x[])
      {
         int aux = 0 ;
         int npass;
         int c = 0;
         boolean trocou;
         trocou = true;
         for ( npass = 1 ; ( npass < x.length) && ( trocou); npass++)
         {
            trocou = false;
         
            for( c = 0; c<x.length -1; c++)
            {
               if ( x[c] > x[c+1]) 
               {
                  aux =x[c]; 
                  x[c] = x[c+1];
                  x[c+1] = aux;
                  trocou = true;
               }
            }
         
         }
      }		
   
       public static void main (String args[])
      {
         String solijogo;
         int jogos;
      
         solijogo = JOptionPane.showInputDialog( " Qual a quantidade de jogos a ser jogados? " );
         jogos = Integer.parseInt(solijogo);
         String resp = ""; 		
      
         for( int z = 0; z < jogos; z++) // Foi criado este for para poder rodar a quantidade de jogos//
         {
           //coloca o numero do jogo
            resp = resp + "Jogo "+ (z+1) + ":\t";
            int x[]= new int [6];
					
            for(int i= 0; i < 6; i ++)
            {  
               x[i] = (int) (Math.random() * 60 + 1);
								}	
						
            bubble(x); // cria jogo //
         
            for(int a = 0; a < x.length ; a++)
            {
			
             resp = resp + x[a] + "\t" ;
            } // mostrar jogo// 
            
            resp = resp + "\n";
         
         }
					
         JTextArea w = new JTextArea (20, 50);
         JScrollPane p = new JScrollPane(w);
         w.append(resp);
         	
         JOptionPane.showMessageDialog(null, p); 
      }			
		}

26 Respostas

ViniGodoy
  1. Vá no seu primeiro post;
  2. Clique em editar;
  3. Coloque o código nas tags code:
Seu código

Senão fica muito difícil de ler.

mario2010

Eu só preciso de um método que compare os arrays e que retorne uma mensagem mostrando quais jogos são iguais…será que alguem poderia me ajudar???

ViniGodoy

Se os arrays estão ordenados, basta fazer:

public boolean saoIguais(int[] array1, int[] array2) {
   if (array1.length != array2.length) 
      return false;

   for (int i = 0; i < array1.length; i++) 
      if (array1[i] != array2[i])
         return false;

   return true;
}
Marck

Olá

E para ordenar seu array, coloque seus elementos dentro de um List e use a classe Collections.sort(list) para ordena-los. É mais fácil.

abraço

mario2010

Muito Obrigado ViniGodoy, funcionou perfeitamente!!!

mario2010

[b]Collections.sort(list)???

como se faz ???

ficaria agradecido se vc pudesse postar…desde já valew!!! ^^[/b]

sergiotaborda

Marck:
Olá

E para ordenar seu array, coloque seus elementos dentro de um List e use a classe Collections.sort(list) para ordena-los. É mais fácil.

É mais fácil simplesmente usar Arrays.sort() que ordena o array directamente

Para compara arrays basta usar Arrays.equals() mas o array precisa estar ordenado.

O problema acima pode ser feito de uma forma mais OO e bem mais fácil

Primeiro, criar a class e Jogo ,ou Aposta. Esta classe conterá os 6 numeros.
Essa classe definirá métodos como equals e hashCode próprio de qq classe.

Ai criamos um método para gerar jogos sem usar random.

Depois colocamos os jogo num Set. Se ele já está lá, geramos outro jogo.

Mais ou menos assim

public Set<Jogo> geraJogos ( int quantidadeDeJogos){

    Set<Jogo> jogos = new HashSet<Jogo>();

    while(jogos.size() < quantidadeDeJogos){

           Jogo jogo = geraJogoAleatoriamente();

           jogos.add(jogo);
   }

   return jogos;

}

private List<Integer> numeros = range(1,60);

public List<Integer> range(int inicio, int fim ){

       List<Integer> res = new ArrayList<Integer>(fim-inicio+1);

      for (int i = inicio-1 ;i < fim; i++){
            res.add(i);
      }

      return res;
}

public Jogo geraJogoAleatoriamente(){

  Jogo jogo = new Jogo();

  Collections.shuffle(numeros); // embaralha

  // pega 6
  for ( int =0; i <6 ; i++){
         jogo.add(numeros.get(i));
  }

  return jogo;
}



public class Jogo {

    Set<Integer> chave = new TreeSet<Integer>();
   
    int hashCode = 0;

    public Jogo(){}

    public void add(Integer numero){
       chave.add(numero);
        hashCode = hashCode * 13  + numero.intValue();
    }

    public int hashCode(){
         return hashCode;
    }

    public boolean equals (Object other){
          return other instanceof Jogo && equals((Jogo )other);
    }

    private boolean equals(Jogo other){
           Set<Integer> copy = new HashSet<Integer>();

           copy.addAll(this.chave);
           copy.removeAll(other.chave); 

           return copy.isEmpty(); // se os elementos são os mesmos a coleção ficará vazia
   }

   public String toString(){
       return chave.toString();
   }
}

Desta forma podemos criar 200 jogos assim

public static void main(String [] args){

   Set<Jogos> duzentosJogos = geraJogos(200);

   System.println(duzentosJogos);
}
ViniGodoy

Como eu vi que ele definia o método bubble, imaginei que não pudesse usar Arrays.sort ou Arrays.equals, ou qualquer collection.

mario2010

sergiotaborda…valew cara…muito interessente…esta classe…gostei bastante…sera mnuito util em outras aplicações…!!
^^

mario2010

Eu havia pensado em utilizar equals, mas num tava dando certo…tambem achei que não dava…

mario2010

[b]Verificando melhor o código, apos inserir a solução do ViniGodoy, ainda resta um BUG, por exemplo, os jogos são criados…um diferente do outro(ótimo), porem existem jogos que os numeros se repetem, exemplo:

Jogo 1: 7 8 14 35 45 57
Jogo 2: 4 5 17 18 18 53

São diferentes, porem no jogo 2, o número 18 é apresentado 2 vezes, o que já causaria um problema se fossemos jogar este jogo na mega sena…como eu poderia impedir numeros repetidos em um jogo???[/b]

Marck

O jeito mais certo é o que o sergio postou, utilizando tudo como objeto. Assim já temos a ordenação natural dos itens no Array/List.

Numa situaçao em que voce não pode reescrever o código, poderia usar o sort de Collections.

mario2010

é neste caso, não posso reescrever o código…não teria algum metodo para que possa inserir na classe???

Marck

É só fazer uma pequena alteração no metodo do Vini:

public boolean saoIguais(int[] array1, int[] array2) {  
      
      Arrays.sort(array1); 
      Arrays.sort(array2);
      
      if (array1.length != array2.length)   
          return false;  
      
       for (int i = 0; i < array1.length; i++)   
          if (array1[i] != array2[i])  
             return false;  
      
    return true;  
}

acho que isso ai resolve.

sergiotaborda

mario2010:
[b]Verificando melhor o código, apos inserir a solução do ViniGodoy, ainda resta um BUG, por exemplo, os jogos são criados…um diferente do outro(ótimo), porem existem jogos que os numeros se repetem, exemplo:

Jogo 1: 7 8 14 35 45 57
Jogo 2: 4 5 17 18 18 53

São diferentes, porem no jogo 2, o número 18 é apresentado 2 vezes, o que já causaria um problema se fossemos jogar este jogo na mega sena…como eu poderia impedir numeros repetidos em um jogo???[/b]

Isso acontece porque está usando Random em vez de shuffle. Vc tem que incluir um codigo que só adiciona o numero no array se ele não estiver lá. ( no codigo que postei o Set cuida disso automaticamente)

mario2010

Ola marck, eu efetuei os testes e o problema…infelizmente persistiu…
eu criei um grupo de 10 jogos e saiu da seguinte maneira…:

Jogo 1: 14 19 19 20 38 50
Jogo 2: 27 37 47 54 55 56
Jogo 3: 13 15 28 41 41 43
Jogo 4: 6 9 10 11 31 50
Jogo 5: 4 16 18 25 50 60
Jogo 6: 2 12 15 17 33 37
Jogo 7: 11 15 23 31 38 59
Jogo 8: 4 7 10 17 18 51
Jogo 9: 17 35 42 44 47 60
Jogo 10: 3 4 23 44 49 58

No jogo 1, o numero 19 m se repetiu e no jogo 3, o numero 41 foi repetido…
alguem teria alguma outra sugestão???

desde já agradeço as sugestões…este é o 1º forum q eu entro que obtive respostas boas e rápidas!

Marck

Opá!

Perai, acho que houve um erro de entendimento. O que voce quer não é saber se Dois ou Mais jogos são iguais, mas sim se há um número repetido em cada jogo.

Ordene os números do jogo, com o esquema que passei anteriormente, teste se o número é igual ao próximo, se sim, troque este número e reinicie a procura por números iguais.

public static void retiraNumRep(int [] ar)
          {
              Arrays.sort(ar);

              for(int i1 = 0; i1 < ar.length-1; i1++)
              {
                  if(i1+1 == ar.length-1)
                      break;
                  if(ar[i1] == ar[i1+1])
                  {
                      ar[i1] = (int)(Math.random() * 60 + 1);

                      //reinicia
                      retiraNumRep(ar);
                  }
              }

          }

Agora vc testa se tem o mesmo numero em um jogo e se tem o mesmo jogo em uma rodada.

Chama depois da chamada a bubble().

bubble(x); // cria jogo //
retiraNumRep(x);
mario2010

Owww cara, agora funcionou sim!!! ^^ Muito obrigado a todos!!!

pedroroxd

Gera um jogo ae pra mim, vou usar ele na mega-sena!!
Posta 30 jogos, vou escolher um e jogar! Se eu ganhar eu te do 10% do premio, e + 10% pro GUJ!!!

HAuHAhuah

PS: que mania chata de escrever em negrito! -.-

mario2010

aushuahsuahusha ai vão os jogos cara…c ganhar…vou querer minha parte hein…hehehehehehhee

Jogo 1: 6 22 24 37 46 50
Jogo 2: 4 38 39 40 55 56
Jogo 3: 6 16 47 51 52 58
Jogo 4: 26 44 48 49 51 54
Jogo 5: 2 4 6 13 31 37
Jogo 6: 8 10 33 39 54 57
Jogo 7: 11 20 22 30 45 51
Jogo 8: 1 15 22 29 49 58
Jogo 9: 8 9 47 49 53 58
Jogo 10:13 22 46 48 55 59
Jogo 11:6 8 17 29 31 37
Jogo 12:1 8 16 18 36 51
Jogo 13:12 17 21 28 35 41
Jogo 14:15 23 24 34 48 60
Jogo 15:4 31 45 47 54 56
Jogo 16:2 4 14 28 41 53
Jogo 17:18 19 31 42 53 56
Jogo 18:1 5 24 46 53 58
Jogo 19:4 14 18 37 51 55
Jogo 20:17 19 25 27 38 46
Jogo 21:3 11 21 33 44 46
Jogo 22:5 18 36 40 42 51
Jogo 23:2 10 28 49 52 53
Jogo 24:3 14 19 33 35 53
Jogo 25:7 17 27 40 46 50
Jogo 26:8 18 25 48 57 60
Jogo 27:3 18 22 24 26 43
Jogo 28:12 24 26 30 38 45
Jogo 29:41 47 49 51 55 57
Jogo 30:14 29 32 37 41 55

è tenho mania de escrever em negrito…mas já estou em tratamento…aushuahsuahsuahus

falowwwwww

pedroroxd

O jogo 25 saiu na loteria faz 2 meses!
kkkkk

mario2010

eita…auhsuahsuahsuahs vou começar a jogar entao…uahsuahusauishuahsuahs
e com ceerteza…se eu ganhar…uma parte vai pro GUJ…=)

pedroroxd

mario2010:
eita…auhsuahsuahsuahs vou começar a jogar entao…uahsuahusauishuahsuahs
e com ceerteza…se eu ganhar…uma parte vai pro GUJ…=)

E para mim, que deu a idéia! huAhuuaa

mario2010

Feito, 10% pra vc e 10% pro GUJ…aushuahsuah ae o resto…hehehehehehehe

pedroroxd

Belessa! To esperando hein!
Pode dar os 20% pra mim, o guj ja ta rico! uAHUhuaua

mario2010

ahsuahsuahushaushaus é o GUJ ta com cara de rico mesmo…imagine, um site que reune um imenso grupo de programadores e futuros programadores da mais completa linguagem de programação…^^

Criado 24 de março de 2010
Ultima resposta 30 de mar. de 2010
Respostas 26
Participantes 5