Comparação IF não funciona entre elementos de listas de inteiros (RESOLVIDO)

4 respostas
V

Olá pessoal, estou com um problema muito estranho. Possuo esses dois vetores de listas de inteiro declarados:

List <Integer> singlePorts1[]; List <Integer> singlePorts2[];

Após uma série de processamentos esses vetores de listas são preenchidos com alguns valores. Em certa parte da minha aplicação eu possuo o seguinte código, que esta dentro de duas outras estruturas de repetição sobre os índices i e j, mas que não são importantes no momento.

for(int k=0;k<singlePorts1[i].size();k++){ for(int l=0;l<singlePorts2[j].size();l++){ System.out.println(("TESTE IF: "+singlePorts1[i].get(k)+" = "+singlePorts2[j].get(l))); if(singlePorts1[i].get(k)==singlePorts2[j].get(l)){ System.out.println("YESS"); } }

A idéia é que em algum momento singlePorts1[i].get(k) seja igual a singlePorts2[j].get(l)), no entanto, de acordo com o java isso nunca ocorre. Eu coloquei o System.out.println(("TESTE IF: "+singlePorts1[i].get(k)+" = "+singlePorts2[j].get(l))); justamente para testar isso, como saída eu consigo:

“TESTE IF: 1300 = 1300” e mesmo os valores sendo iguais o código dentro do IF não é executado.

NA busca de soluções fiz teste com o seguinte código:

for(int k=0;k<singlePorts1[i].size();k++){ for(int l=0;l<singlePorts2[j].size();l++){ int a = singlePorts1[i].get(k); int b = singlePorts2[j].get(l); System.out.println(("TESTE IF: "+singlePorts1[i].get(k)+" = "+singlePorts2[j].get(l))); if(a==b){ System.out.println("YESS"); } }

Neste caso o IF funciona normalmente, alguém saberia me dizer porque a minha comparação direta com os elementos das listas não funcionou e tive que usar variaveis primitivas de int para isso ?

Muito obrigado.

4 Respostas

drsmachado

Por que está comparando objetos, cara.
Integer não é int. Integer é uma classe java do package java.lang e seus elementos, por mais que assumam várias características do primitivo int, são objetos.
Logo, você deve compará-los através do método equals.

if(singlePorts1[i].get(k)equals(singlePorts2[j].get(l))){  
               System.out.println("YESS");
}

E, você tem resultado na segunda abordagem pois ao fazer

int a = singlePorts1[i].get(k);  
             int b = singlePorts2[j].get(l);

Você “desempacota” o intValue do objeto Integer e então o == é assertivo.

V

Perfeito ^^

Pensava que equals() era só para Strings, muito obrigado (:

drsmachado

vinicius.olifer:
Perfeito ^^

Pensava que equals() era só para Strings, muito obrigado (:


Esse é um erro comum.
O método equals é herdado da superclasse Object por alguma razão e, a razão é justamente essa.
Objetos são sempre comparados pelo método equals (salvo se você criar uma forma de fazer tal comparação que não seja esta).

E

Se as suas listas de java.lang.Integer não tiverem elementos nulos, você pode tentar:

if(singlePorts1[i].get(k) - singlePorts2[j].get(l) == 0){

Como exercício, explique:
a) Por que é que isso funciona, e
b) Se você tiver elementos nulos em pelo menos uma dessas listas, o que ocorre?

Criado 16 de julho de 2013
Ultima resposta 16 de jul. de 2013
Respostas 4
Participantes 3