Como comparar dois valores de um objeto em javva

Igualdade ampla compara dois valores para a igualdade, após converter ambos os valores para um tipo comum.   Após as conversões (um ou ambos os lados podem sofrer conversões), a comparação de igualdade final é realizada exatamente como === executa.  Igualdade ampla é simétrica: A == B sempre tem semântica idêntica à B == A para quaisquer valores de A e B.

A comparação de igualdade é realizado da seguinte forma para os operandos dos vários tipos:

Na tabela acima, ToNumber(A) tenta converter seu argumento para um número antes de comparação. Seu comportamento é equivalente a +A (o operador + unário). ToPrimitive(A) tenta converter seu argumento de objeto para um valor primitivo, tentando invocar sequências diferentes de A.toString e A.valueOf métodos em A.

Tradicionalmente, e de acordo com ECMAScript, todos os objetos são amplamente desiguais a undefined e null. Mas a maioria dos navegadores permitem uma classe muito limitada de objetos (especificamente, o objeto document.all para qualquer página), em alguns contextos, para agir como se eles emulassem o valor undefined. Igualdade ampla é um desses contexto. Portanto, o método IsFalsy(A) é avaliada como verdadeira se, e somente se, A for um objeto que emula undefined. Em todos os outros casos, um objeto não é amplamente igual a undefined ou null.

var num = 0; var obj = new String("0"); var str = "0"; console.log(num == num); console.log(obj == obj); console.log(str == str); console.log(num == obj); console.log(num == str); console.log(obj == str); console.log(null == undefined); console.log(obj == null); console.log(obj == undefined);

Alguns desenvolvedores consideram que nunca é uma boa idéia, praticamente, usar a igualdade ampla. O resultado de uma comparação usando a igualdade estrita é mais fácil de prever, e como nenhum tipo de coerção ocorre, a avaliação pode ser mais rápida.

Colegas,

No for abaixo quero comparar a igualdade entre os objetos ServicoCategoria, porém não retorna igual. Obseve que se eu comparo pelos ids retorna igual, porém os objetos ele diz que são diferentes.

Onde estou errando?

Muito obrigado, Marques[code]

public void prepareEditare(ServicoPlano plano) {

String query = "from ServicoCategoria o order by o.categoria, o.descricao"; Map<String, Object> params = new HashMap<String, Object>(); servicoCategorias = servicoCategoriaService.findByParam(query, params); for (ServicoCategoria servicoCategoria : servicoCategorias) { if (servicoCategoria.getId().compareTo(plano.getCategoriaServico().getId()) == 0) { System.out.println("Se os ids são iguais, por que na comparação dos objetos na linha abaixo não são iguais?"); boolean teste = servicoCategoria.equals(servicoPlano.getCategoriaServico()); System.out.println("Valor de teste: " + teste); // teste retorna false } } }[/code]

[code]public abstract class Entity implements Serializable {

public abstract Long getId(); @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Long.signum(getId() ^ (getId() >>> 32)); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Entity other = (Entity) obj; if (getId() != other.getId()) return false; return true; }

}[/code][code]@javax.persistence.Entity
@Table(name = “servico_categoria”) public class ServicoCategoria extends Entity {

private static final long serialVersionUID = 1L;

@Id @GeneratedValue private Long id; @Column(name = "categoria", nullable = false) @Enumerated(EnumType.STRING) private ServicoCategoriaEnum categoria; private String descricao; public ServicoCategoria() {} public Long getId() { return id; } public void setId(Long id) { this.id = id; } public ServicoCategoriaEnum getCategoria() { return categoria; } public void setCategoria(ServicoCategoriaEnum categoria) { this.categoria = categoria; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (!(obj instanceof ServicoCategoria)) return false; ServicoCategoria other = (ServicoCategoria) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; }

}
[/code]

implementa a interface Comparable…

http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html

se eu tivesse um exemplo aqui eu postava… sorry mais esse é o caminho ok?

Olá,

Você pode implementar a interface Comparable, como o amigo acima disse, ou você pode implementar um Comparator para sua necessidade. Tenho um exemplo no meu blog:

http://fazcertoquefunciona.wordpress.com/2012/05/09/comparando-e-ordenando-objetos-em-uma-collection-java/

Uma pergunta:
Com o método equals não funciona? Para que serve os métodos equals e hashcode?

Muito obrigado,
Marques

[quote=Marques]Uma pergunta:
Com o método equals não funciona? Para que serve os métodos equals e hashcode?

Muito obrigado,
Marques[/quote]

é muito usado com Map, Set e etc… pq vc quer garantir que só ira existir um desse cara armazenado…

Equals e comparable são conceitos diferentes. O equals testa se dois objetos são iguais. O comparable dá a noção de ordenação dos objetos.

Dois objetos diferentes podem ter a mesma ordem. E dois objetos iguais podem ter ordens diferentes.

Se você quer fazer um teste com equals, use o método equals, e não com compareTo igualando a 0:

if (servicoCategoria.equals(plano.getCategoriaServico()) == 0) {

Vini,

Isso não é exatamente o que estou fazendo nessas linhas?

boolean teste = servicoCategoria.equals(servicoPlano.getCategoriaServico()); System.out.println("Valor de teste: " + teste); // teste retorna false

E no entanto a igualdade não se verifica…

É sim, desculpe, não havia visto aquele código.

Mas observe que o equals testa se: a) Os dois objetos são EXATAMENTE da mesma classe (filhos não valem);

b) O objeto comparado não é nulo

Provavelmente uma dessas condições não está batendo. O ideal é colocar no equals um breakpoint e analisar passo-a-passo o que está ocorrendo.

Como comparar dois valores de um objeto em javva
Marques:

[code]public abstract class Entity implements Serializable {

@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Entity other = (Entity) obj; if (getId() != other.getId()) return false; return true; }

}[/code]

O erro está na linha getId() != other.getId()

teria que ser !getId().equals(other.getId())

Tem que usar o equals entre objetos. Vc está usando !=. Os objetos de ID não têm que ser os mesmos, têm que ser iguais. Vc está comparando se são o mesmo. Por isso dá false.
Quando vc usa o comparaTo no outro codigo dá certo porque vc esá comparando se são iguais e não se são o mesmo.

sergiotaborda,

Era isso mesmo! Vlw amigão!!!

Tem razão. Eu geralmente não uso tipos wrapper para representar o que pode ser representado por tipos primitivos.