Como comparar dois objetos diferentes da mesma classe c++

Pessoal, me da uma grande ajuda por que estou com uma grande duvida.

Vamos supor q tenho uma classe de nome Funcionario e esta classe tem vários atributos, podemos dizer q 100 (só pra exemplo mesmo).

Instancio dois funcionarios e preencho os atributos dos dois, com os mesmos dados.

Para saber se os dois funcionários sao iguais, tenho que comparar todos os atributos? pq se eu comparar a referencia de cada funcionario, vai dar que sao diferentes.

Pra exemplificar melhor, vou colocar o código aqui:

Funcionario f1 = new funcionario(); Funcionario f2 = new funcionario(); f1.setNome("Camilo Oscar Girardelli Baptista"); f1.setDataAdmissao("01/02/2009"); f1.setDepartamento("Administrativo"); f1.setRg("10.911.615"); f1.setSalario(2000.00); f1.setSituacaoAtual(true); f2.setNome("Camilo Oscar Girardelli Baptista"); f2.setDataAdmissao("01/02/2009"); f2.setDepartamento("Administrativo"); f2.setRg("10.911.615"); f2.setSalario(2000.00); f2.setSituacaoAtual(true); //Nesse caso a comparação é diferente if(f1.equals(f2)){ System.out.println("igual"); }else{ System.out.println("diferente"); } //Neste caso, também é diferente if(f1 == f2){ System.out.println("igual"); }else{ System.out.println("diferente"); } //Neste caso, é igual if(f1.getNome() == f2.getNome()){ System.out.println("igual"); }else{ System.out.println("diferente"); }

Mas se eu quiser saber se todos os atributos sao iguais, tenho comparar 1 a 1? ou existe alguma forma mais pratica e rapida?

Aguardo retorno.

Abraços

atraves de mecanismos da classe Class, vc pode recuperar todos os fields da sua classe… e comparar todos eles… em um for ^^

Beleza, mas tipo, fazendo um for, eu estaria fazendo meio que no braço, que era o que eu estava fazendo mesmo. Mas nao existe alguma comparação tipo o equals né?

Abraços

vc pode usar essa rotina… porem, cuidado… pq ele vai testar todos os fields… inclusive hashCodes, se não quiser testar hashCode, vc tera que alterar a rotina…

public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof NewClass)) //Mude essa linha para o nome da sua classe return false; boolean result = false; try { for (Field field : getClass().getFields()) { Object thisFieldValue = field.get(this); if (thisFieldValue == null) result = field.get(obj) == null; else { field.setAccessible(true); //essa linha libera acesso inclusive a campos privados das superclasses result = thisFieldValue.equals(field.get(obj)); } if (!result) break; } } catch (IllegalArgumentException ex) { //teoricamente não vai ocorrer esse erro... } catch (IllegalAccessException ex) { //com a inclusão da linha de acesso field.setAccessible(true) não deve ocorrer esse erro } return result; }

Beleza, valew pela ajuda.

camilooscar:

Beleza, valew pela ajuda.

eu fiz algumas modificações tem alguns edits, para incluir algumas linhas ^^ …

tipo… c vc kizer… vc pode criar uma classe utilitaria, para testar todos os campos… onde vc recebe 2 objetos, testa os campos dos 2, e retorna o resultado… ou pode implementar esse equals ai…

espero que de certo ^^… é melhor que comparar no braço 100 campos =x

Vou criar a classe q fica mais claro na hora de utilizar.

Certeza, comparar muitos atributos no braço é complicado, sem contar a bagunça que fica depois.

Valew pela ajuda.

Pra que complicar tanto.

Vc quer comparar 2 objetos.
Com certeza seu objeto FUNCIONARIO tem um atributo que identifique ele UNICAMENTE. Como por exemplo um ID.

Basta sobrescrever o equals e definir o criterio de comparação (Ex: Se ids sao iguais, entao é o mesmo objeto. Ou NOMES iguais).

Fica ao seu criterio.

Beleza, mas dai nao saberei se ele todos os atributos iguais.

No caso de um funcionario, ficaria bem mais facil do jeito que vc falou, por que com id, e/ou nome, ja saberia ou nao, mas vamos supor no caso de um aparelho, que tenho q fazer uma separação por atributos.

Dai fica mais facil criar a classe para compara-los toda vez.

Valew

[quote=fabim]Pra que complicar tanto.

Vc quer comparar 2 objetos.
Com certeza seu objeto FUNCIONARIO tem um atributo que identifique ele UNICAMENTE. Como por exemplo um ID.

Basta sobrescrever o equals e definir o criterio de comparação (Ex: Se ids sao iguais, entao é o mesmo objeto. Ou NOMES iguais).

Fica ao seu criterio.
[/quote]

com certeza essa é a melhor forma ^^ … mas… como ele pediu uma forma pra comprar as 100 propriedades… heheh… mandei o código… apesar que esse modo pode diminuir d + o desempenho

comprar 2 ids é sempre o ideal

[quote=camilooscar]Beleza, mas dai nao saberei se ele todos os atributos iguais.

No caso de um funcionario, ficaria bem mais facil do jeito que vc falou, por que com id, e/ou nome, ja saberia ou nao, mas vamos supor no caso de um aparelho, que tenho q fazer uma separação por atributos.

Dai fica mais facil criar a classe para compara-los toda vez.

Valew[/quote]

o ideal mesmo é sempre implementar o método equals… em cada classe particular…

sempre que vc precisar saber de algo, basta usar o equals…

2 pessoas são iguais quando seu CPF é igual…
2 carros são iguais quando suas placas são igauis…

e assim vai… ai no lugar de 102930 atributos… vc ja olha as propriedades certas

hehehehehe, com certeza, quando se tem um ID, por exemplo, dai fica tudo mais facil.

Esse código, dependendo da quantidade de atributos, diminuiria muito o desempenho mesmo, mas é bom sabermos q existe tambem, pq se em algum caso nao conseguirmos fugir do problema com uma comparação por ID ou mais simplificada, dai tem q ser assim mesmo.

Valew

Respondendo a pergunta original do topico:

NAO. Nao precisa comparar todos os atributos (na real vc nunca vai fazer isso)

Um FUNCIONARIO que nao tenha um ID identificador nao faz NENHUM sentido. Mesmo que esse dado nao seja persistente (vide casos dos projetos SCJD)

Vc pode criar esses ID’s em memoria, justamente pra fazer distincao entre eles.

Ok,

Criando este ID em memória tem como ter mais controle mesmo.

Tambem achei q nao teria uma situação real onde a gente teria q fazer a comparação de todos os atributos, mas antes de tirar minha propria conclusão, achei mais interessante pegar opinioes com o pessoal mais avançado.

Valew pela ajuda.

Abraços

Eu teria cuidado para comparar dois objetos apenas pelos seus atributos.

Eu posso ter 2 objetos ‘iguais’ do ponto de vista do meu dominio mas com atributos diferentes. Por exemplo eu tenho 2 instâncias do funcionario e em uma eu alterei o salario (e não fiz a persistencia): os dois funcionarios continuam sendo os mesmos porém com salarios diferentes (de instantes diferentes). Agora se vc compara pela chave primaria, por exemplo, vc pode ter uma comparação mais interessante.

Perceba que, nesse caso, vc quer saber se duas entidades representam o mesmo objeto ‘no banco de dados’. Se vc vai sobreescrever o equals é interessante vc pensar aonde vc quer utilizar. Se eu for comparar usuarios do GUJ, por exemplo, eu posso simplesmente comparar o login dos mesmos, ao inves do id no banco, vai depender do que eu quero fazer. Eu só tomaria cuidado para não fazer nada recursivo sobre alguns atributos e seus descendentes pois posso (o que não quer dizer que irei) criar cascatas de comparações desnecessarias.

[quote=camilooscar]Ok,

Criando este ID em memória tem como ter mais controle mesmo.

Tambem achei q nao teria uma situação real onde a gente teria q fazer a comparação de todos os atributos, mas antes de tirar minha propria conclusão, achei mais interessante pegar opinioes com o pessoal mais avançado.

Valew pela ajuda.

Abraços[/quote]

Sim, é valido.
Vc acabou pegando uma dica sobre Reflection, que pode vir a precisar um dia

Perfeito, bem lembrado, nem tinha pensado nisso.

Valew

Última postagem

Tag