[RESOLVIDO] java.lang.NullPointerException em ordenação de Arrays

10 respostas
Reginildo

Eu estava tentando colocar números de uma array em ordem decrescente mas deu um java.lang.NullPointerException e ainda não caiu a ficha do que poderia ter sido o problema.

Eis o código...

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Calculo {
	private List<Integer> arrayDezJogos = new ArrayList<Integer>(Arrays.asList(
			10, 24, 6, 16, 21, 5, 4, 22, 14, 11, 17, 19, 2, 18, 23, 21, 15, 1,
			3, 5, 14, 2, 11, 17, 4, 10, 25, 7, 13, 22, 24, 20, 18, 10, 14, 17,
			11, 13, 21, 15, 16, 6, 2, 22, 7, 22, 23, 17, 15, 1, 11, 16, 4, 8,
			12, 3, 10, 13, 25, 24, 9, 22, 18, 23, 4, 20, 25, 11, 13, 19, 12,
			10, 21, 16, 24, 11, 6, 14, 16, 3, 2, 13, 17, 21, 4, 22, 24, 5, 10,
			12, 2, 4, 7, 22, 23, 25, 14, 17, 20, 3, 13, 1, 5, 15, 9, 13, 20,
			17, 16, 23, 5, 3, 6, 1, 19, 22, 4, 7, 24, 21, 9, 10, 8, 25, 13, 11,
			17, 22, 23, 24, 21, 1, 4, 7, 20, 21, 15, 16, 24, 6, 17, 1, 18, 22,
			12, 2, 23, 25, 9, 10));

	Integer[] frequency = new Integer[26]; 

	public static void main(String[] args) {
		Calculo calc = new Calculo();
		calc.resultadosObtidos();
	}

	private void resultadosObtidos() {
		ultimosDezJogosAnalise();
		emOrdem(frequency);
	}

	private void ultimosDezJogosAnalise() {

		for (int number : arrayDezJogos) {
			switch (number) {
			case 1:
				++frequency[1];
				break;
			case 2:
				++frequency[2];
				break;
			case 3:
				++frequency[3];
				break;
			case 4:
				++frequency[4];
				break;
			case 5:
				++frequency[5];
				break;
			case 6:
				++frequency[6];
				break;
			case 7:
				++frequency[7];
				break;
			case 8:
				++frequency[8];
				break;
			case 9:
				++frequency[9];
				break;
			case 10:
				++frequency[10];
				break;
			case 11:
				++frequency[11];
				break;
			case 12:
				++frequency[12];
				break;
			case 13:
				++frequency[13];
				break;
			case 14:
				++frequency[14];
				break;
			case 15:
				++frequency[15];
				break;
			case 16:
				++frequency[16];
				break;
			case 17:
				++frequency[17];
				break;
			case 18:
				++frequency[18];
				break;
			case 19:
				++frequency[19];
				break;
			case 20:
				++frequency[20];
				break;
			case 21:
				++frequency[21];
				break;
			case 22:
				++frequency[22];
				break;
			case 23:
				++frequency[23];
				break;
			case 24:
				++frequency[24];
				break;
			case 25:
				++frequency[25];
				break;
			}
		}

		System.out.printf("%s%12s\n", "Dezena", "Frequência");

		// saida de cada elemento do array
		for (int face = 1; face < frequency.length; face++) {
			System.out.printf("%6d%12d\n", face, frequency[face]);
		}		
	}

	private void emOrdem(Integer[] frequencia) {
		System.out.println("VALORES E ORDEM DECRESCENTE");
		Arrays.sort(frequencia, Collections.reverseOrder());
		for (int number = 1; number < frequencia.length; number++) {
			System.out.printf("%6d%12d\n", number, frequencia[number]);

		}
	}
}

10 Respostas

ViniGodoy

frequency[0] ainda está nulo. Atribua o valor 0 nele. Ou transforme o array frequency em um array de ints e não de Integers.

ViniGodoy

Aliás, dá para eliminar todo seu switch:

private void ultimosDezJogosAnalise() {  
  
        for (int number : arrayDezJogos) {  
            ++frequency[number];
        }
 }
Reginildo

Eu atribuí frenquency[0] = 0; porém ainda insiste o problema java.lang.NullPointerException

ViniGodoy

Na verdade, se você for usar Integer (que são objetos) você deve atribuir 0 em todos os índices, antes de começar a fazer calculos. Objetos são inicializados com null, e não com 0.

Troque seu array para um array de int. Não tem porque usar objetos nesse caso.

Reginildo

Eu já tentei fazer isso e o eclipse acusa um problema. Se eu usar tipo primitivo int eu não vou conseguir usar o método Collections.reverseOrder() no método emOrdem().

private void emOrdem(Integer[] frequencia) {
		System.out.println("VALORES E ORDEM DECRESCENTE");
		Arrays.sort(frequencia, Collections.reverseOrder());
		for (int number = 1; number < frequencia.length; number++) {
			System.out.printf("%6d%12d\n", number, frequencia[number]);

		}
	}
ViniGodoy

Entendi. Então inicializa todos os seus indices com 0 antes, no construtor da sua classe.

Reginildo

Ok. Tudo certo. Agora algo que eu queria saber é como colocar os valores contidos na array frequencia[] junto com sua “index” no método emOrdem(). Existem algum método que eu possa fazer isso?

Ex:

index frequencia 0 0 1 2 2 1 3 5 4 7 5 5 etc... etc...

ViniGodoy

Não entendi. Já não está assim?

Reginildo

Não, não está em ordem. Apenas no metodo ultimosDezJogosAnalise() eu fiz isso e está em ordem realmente, o que na verdade é bem simples:

for (int face = 1; face &lt; frequency.length; face++) { System.out.printf(&quot;%6d%12d\n&quot;, face, frequency[face]);

Porém nesse código abaixo os valores não correspondem a index mostrada porque eu mudei a ordem. Eu só repeti que tinha feito anteriormente. Então a "chave" (index) da array não corresponde ao valor mostrado:

Arrays.sort(frequencia, Collections.reverseOrder()); for (int number = 1; number &lt; frequencia.length; number++) { System.out.printf(&quot;%6d%12d\n&quot;, number, frequencia[number]); }

CWeiler

Não existe método pronto para ordenar dois arrays baseado em um.

Ou você implementa a ordenação ou utiliza uma classe como HashMap.

Criado 10 de julho de 2014
Ultima resposta 11 de jul. de 2014
Respostas 10
Participantes 3