Ordenando números em Java

(Última atualização em: 7 de dezembro de 2015)

Por esses dias a Mega-Sena acumulou de novo… Chegou ao valor de R$ 200 milhões! Porém, eu sempre fico muito indeciso em qual jogo fazer, então vou pedir para que o meu sistema jogue por mim. Vamos criar nosso array de int de 6 posições para armazenar os números:

int[] numeros = new int[6];

Agora varremos nosso array e preenchemos cada posição com um valor aleatório entre 1 e 60, utilizando a classe Random e seu método nextInt():

for (int i = 0; i <= numeros.length; i++) {
	numeros[i] = new Random().nextInt(60);
}

Imprimindo o nosso array com o método toString() da classe Arrays:

System.out.println(Arrays.toString(numeros));	

Resultado:

[10, 6, 54, 47, 0, 35]

Ele gerou 6 números aleatórios! Mas, espera aí… um desses números é o 0??? A Mega-Sena sorteia apenas números entre 1 e 60… O método nextInt() com parâmetro 60 significa que será retornado um valor do tipo int entre 0 e 59. Para resolver esse problema, precisamos somar 1 no momento que geramos os números aleatórios:

for (int i = 0; i < numeros.length; i++) {
     numeros[i] = new Random().nextInt(60) + 1;
}

Resultado:

[53, 32, 60, 1, 40, 24]

Ótimo! O sistema gerou um jogo da Mega-Sena! E, como podemos ver, dessa vez o número 60 apareceu.

Mas ainda tem um probleminha, esses números estão desordenados… Imagina na hora de preencher o volante da Mega-Sena: marco o 53, depois o 32 e depois terei que avançar para o número 60! E quando sair o resultado? Terei que procurar a dedo? Que horror! O método estático sort() da classe Arrays nos auxilia na ordenação de vetores numéricos:

Arrays.sort(numeros);
System.out.println(Arrays.toString(numeros));

Resultado: 

[13, 21, 37, 48, 51, 55]

Excelente! Conseguimos gerar o nosso jogo da Mega-Sena! Mas agora, ao invés de utilizar um array, eu quero usar uma solução mais sofisticada. Uma List,por exemplo:

List numeros = new ArrayList();

Agora, vamos preencher a nossa List com um while:

while (numeros.size() < 6) {
     int numero = new Random().nextInt(60) + 1;
     numeros.add(numero);
}

E para ordenar? Usarei o método sort() da classe Arrays? Infelizmente o método sort() da classe Arrays espera apenas arrays como parâmetro e uma List é uma Collection… Porém existe o método estático sort() para Collection utilizando a classe Collections:

Collections.sort(numeros);
System.out.println(numeros);

Resultado:

[9, 12, 16, 49, 49, 56]

Ele gerou o jogo como esperado! Mas, espera um pouco… 49 e 49? Como assim?? A Mega-Sena não permite jogos com números repetidos… A interface List possui o método contains() que permite verificar se um número já existe dentro da lista. Então, basta adicionar um if no momento da inserção dos números:

while (numeros.size() < 6) {
     int numero = new Random().nextInt(60) + 1;
     if(!numeros.contains(numero)){
          numeros.add(numero);
     }
}

Nesse trecho estou dizendo que, se não existir o novo número aleatório dentro da lista de números, adicione. Testando a nova implementação:

Collections.sort(numeros);
System.out.println(numeros);

Resultado:

[16, 20, 27, 34, 39, 52]

Agora o nosso sistema não permite números repetidos!

Vimos como é fácil ordenar números em Java, pois já temos métodos disponíveis para resolver esse problema. Lembre-se sempre desses passos antes de ordenar:

  • Quantos números preciso gerar?
  • Posso repetir algum número?

Gostou da List? Quer aprender mais APIs e bibliotecas do Java? O Alura possui um curso de Java que explica com mais detalhes as principais APIs e bibliotecas, com 3.158 alunos inscritos e com recomendação de 96%.

Content Editor at Alura and Software Developer

  • Renato

    Estou estudando lógica de programação no alura e gostaria de ver este algoritmo em JavaScript pois é a atual linguagem que estudo no momento.

    • Alex Felipe

      Oi Renato, tudo bem? Eu fiz um exemplo praticamente “igual” ao mostrado no post em javascript, dê uma olhada:


      //definindo o array
      var numeros = [];
      //definindo o tamanho para o for
      var tamanho = 6;

      //for que adiciona os valores aleatórios
      for(var i = 0; i < tamanho; i++){
      //números aleatórios de 1 a 60
      var numero = Math.floor((Math.random() * 60) + 1);
      //verifica se o número gerado já está dentro do array
      if(numeros.indexOf(numero) === -1) {
      //adiciona número no array
      numeros.push(numero);
      }
      }

      //ordena array
      numeros.sort();

      //imprime array
      console.log(numeros);

      Da até pra testar no console do navegador 🙂

Próximo ArtigoPegando a data atual em Java