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))
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))
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");
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.
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
Como você declarou a variável freqAbs?
ArrayList freqAbs = new ArrayList();
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.
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++)
Demorei editando a msg e o Sem_Nome postou a mesma coisa antes de mim 
<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>
Qual o problema? Os 2 códigos que enviou são distintos.
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] + " ");
}
}
Tipo eu fiz ele primeiro em javascript certo, e no browser funciona normalmente, porque você acha que não ordena ?
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] + " ");
}
}
Vlw ae cara qualquer coisa eu posto aqui de novo =]