Ordenando números em Java

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? A 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%.

Leia também:

Veja outros artigos sobre Programação