Problema com Array

12 respostas
K

Boa tarde pessoal, estou com problema para comparar um array com ele mesmo na seguinte parte .get(h + 1) se eu colocar um número normal (ex: 1,2,3) sem efetuar nenhuma operação funciona normalmente.

if (freqAbs.get(h) > freqAbs.get(h + 1))

12 Respostas

asousaj

Quando tiver uma falha poste a mesma aqui assim fica mais fácil ajudar.
Não entendi 100% da sua duvida mas vou tentar ajudar.

Array ou ArrayList?
Array não possui o método get.
Segue exemplo considerando ArrayList. Obviamente o index usado no método get deve ser válido.

int h = 0;
List<Integer> freqAbs = new ArrayList<Integer>();
freqAbs.add(5);
freqAbs.add(7);
freqAbs.add(8);
		
if (freqAbs.get(h) > freqAbs.get(h + 1))
	System.out.println("maior");
else
	System.out.println("menor");
J

seu “h + 1” deve estar dando um indice que não existe.

Ex.:

Sua lista tem 4 posições(0,1,2,3), quando você já está na última que seria h = 3, quando você da um get(h + 1) fica get(4) e da erro porque não existe posição 4. (:

Acredito que seja isso, é o que da pra deduzir com as informações que você passou.

K
se eu coloca posição fixa funciona. tenho uma seguinte estrutura.
for (int h = 0; h < limite; h++) {
                //bug no h + 1
                if (freqAbs.get(h) > freqAbs.get(h + 1)) {
                    mantemNum = numNaoRepetidos.get(h);
                    mantemAbs = freqAbs.get(h);
                    mantemRel = freqRel.get(h);
                    
                    numNaoRepetidos.set(h,h + 1);
                    freqAbs.set(h,h + 1);
                    //Como o vetor (freqRel) é do tipo Double ele exige que 
                    //seja passado no segundo parâmetro um valor do tipo 
                    //Double (auxRel).
                    auxRel = h + 1;
                    freqRel.set(h,auxRel);
                    
                    numNaoRepetidos.set(h + 1, mantemNum);
                    freqAbs.set(h + 1, mantemAbs);
                    freqRel.set(h + 1, mantemRel);
                    troca = h;
                }
            }

error:

O número 1 foi digitado 2 vezes com F.A: 2 e F.R: 15,38 %.
O número 2 foi digitado 2 vezes com F.A: 2 e F.R: 15,38 %.
O número 3 foi digitado 4 vezes com F.A: 4 e F.R: 30,77 %.
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7
O número 4 foi digitado 2 vezes com F.A: 2 e F.R: 15,38 %.
O número 5 foi digitado 1 vezes com F.A: 1 e F.R: 7,69 %.
O número 6 foi digitado 1 vezes com F.A: 1 e F.R: 7,69 %.
O número 33 foi digitado 1 vezes com F.A: 1 e F.R: 7,69 %.
Vetor da frequência absoluta desordenado:[2, 2, 4, 2, 1, 1, 1]
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at atividades.RelativaAbsoluta.main(RelativaAbsoluta.java:77)
Java Result: 1

S

Como você declarou a variável freqAbs?

K

ArrayList freqAbs = new ArrayList();

S

Não tinha lido direito o Stacktrace.

Você simplesmente está acessando uma posição que não existe no ArrayList.

Ele vai de 0 a 6 e você está tentando acessar o índice 7, que não existe.

asousaj

Simples seu array possui apenas 7 índices de 0 a 6.
Em determinado momento está buscando o índice 7, por isso a falha
Exception in thread “main” java.lang.IndexOutOfBoundsException: Index: 7, Size: 7

Não sei o restante do seu código, mas vou chutar, mas teste assim:

for (int h = 0; h < limite-1; h++)

EDIT

Demorei editando a msg e o Sem_Nome postou a mesma coisa antes de mim :smiley:

K
Tenho o código em javascript para ajuda :
<script>

    var aArr = new Array(8, 3, 10, 1, 0 , -3, 9, 4);
    var aux = 0, troca = 1, limite = aArr.length;

    while(troca != 0){
        troca = 0;
        for (s = 0; s < limite; s++) {
            if (aArr[s] > aArr[s + 1]) {
                aux = aArr[s];
                aArr[s] = aArr[s + 1];
                aArr[s + 1] = aux;
                troca = s;
            }
        }
        limite = troca;
    }
    document.write(aArr);

</script>
asousaj

Qual o problema? Os 2 códigos que enviou são distintos.

kixtz:
Tenho o código em javascript para ajuda :

Não sei a utilidade deste código, já lhe adianto que ele não ordena todo o array, mas mesmo assim segue em Java, quase nenhuma alteração:

public class Teste {
	public static void main(String[] args) {
		int[] aArr = { 8, 3, 10, 1, 0, -3, 9, 4 };
		int aux = 0, troca = 1, limite = aArr.length;

		while (troca != 0) {
			troca = 0;
			for (int s = 0; s < limite - 1; s++) {  //se não colocar limite - 1 ele estoura o indice
				if (aArr[s] > aArr[s + 1]) {
					aux = aArr[s];
					aArr[s] = aArr[s + 1];
					aArr[s + 1] = aux;
					troca = s;
				}
			}
			limite = troca;
		}
		for (int z = 0; z < aArr.length; z++)
			System.out.print(aArr[z] + " ");
	}

}
K

Tipo eu fiz ele primeiro em javascript certo, e no browser funciona normalmente, porque você acha que não ordena ?

asousaj

Porque a saída é 1 0 3 -3 8 9 4 10 .
Realmente em javascript funciona.

Para Java fiz uma pequena alteração e funcionou.

public class Teste {
	public static void main(String[] args) {
		int[] aArr = { 8, 3, 10, 1, 0, -3, 9, 4 };
		int aux = 0, troca = 1, limite = aArr.length;

		while (troca != 0) {
			troca = 0;
			for (int s = 0; s < limite - 1; s++) {
				if (aArr[s] > aArr[s + 1]) {
					aux = aArr[s];
					aArr[s] = aArr[s + 1];
					aArr[s + 1] = aux;
					troca = s;
				}
			}
			limite--;//mudei aqui
		}
		for (int z = 0; z < aArr.length; z++)
			System.out.print(aArr[z] + " ");
	}
}
K

Vlw ae cara qualquer coisa eu posto aqui de novo =]

Criado 21 de outubro de 2013
Ultima resposta 23 de out. de 2013
Respostas 12
Participantes 4