Erro ao implementar o método compara

Boa Tarde Pessoal,

Fazendo a implementação do método compara, o mesmo reporta erros ao fazer o teste na classe TestaFuncionario:

Meu código do método compara:


 public void compara(boolean f1,boolean f2){
    	if (f1 == f2){

    		System.out.println("Iguais");

    	}else {
    		System.out.println("Diferentes");
    	}
    }

Minha classe TestaFuncionario:


public class TestaFuncionario{

		public static void main (String [] args){
		Funcionario f1 = new Funcionario();
		f1.nome = "Rafael";
		f1.salario = 1000.00;
		f1.departamento = "TI";
		f1.dataDeEntrada = "08022011";
		f1.RG = "264469479";
		f1.atendePessoas(false, false);
		f1.bonifica(80);
		f1.mostra();


		Funcionario f2 = new Funcionario();
		f2.nome = "Rafael";
		f2.salario = 1000.00;
		f2.departamento = "TI";
		f2.dataDeEntrada = "08022011";
		f2.RG = "264469479";
		f2.atendePessoas(false, false);
		f2.bonifica(80);
		f2.mostra();

		f2.compara(true, true);



		}
}

Quando eu altero o valor de f2.compara para (true, false), o mesmo retorna que os usuários são diferentes, sendo que os mesmos estão iguais. Se utilizo valores do tipo String no método compara, volta uma mensagem de erro ao fazer a comparação. Estou achando estranho isso, pois para mim parece que tenho que usar um valor booleano, mas o operador == não é compatível com esse tipo de valor, correto?

Agradeço desde já pela ajuda.
Rafael.

Amigo o seu método compara etá correto quanto a comparações de duas variáveis booleanas! a questão é, o que você está querendo que seu método compare?

Filho, o que está tentando fazer ?

		boolean a = true;
		boolean b = true;		
		
		System.out.println(a == b);

Isso é perfeitamente válido. Qual seu objetivo?

jrbonilha,

O método compara é para comparar o funcionário com outro funcionário? Nesse caso não deveria ser da forma a seguir?

public void compara(Funcionario f2)

E dentro do método você iria colocar como deve comparar. O que define se dois funcionários são iguais? O nome igual? O RG igual? Aí você faria a lógica, os ifs para responder se os funcionários são iguais.

Da forma que você colocou, ele está comparando dois booleanos. Por exemplo, colocando f2.compara(true, true), ele sempre vai retornar que são iguais, porque true é igual a true. Não importa se os funcionários são iguais ou diferentes. Colocando f2.compara(true, false) ele sempre vai dizer que são diferentes, porque true é diferente de false.

Alcides,

Então é isso, estava contando que teria que usar valores booleanos para fazer a comparação, mas devo declarar como funcionario e fazer as comparações no corpo do método ao invés de fazer uma comparação apenas baseando nos valores true ou false.

Vou fazer as alterações e depois posto aqui o resultado, obrigado a todos!

Abraços,
J Rafael.

Pessoal,

Fiz as alterações no método compara(), mas como devo fazer para a comparação funcionar na classe TestaFuncionario?

Já que defini no método compara como abaixo:

  public void compara(Funcionario f1,Funcionario f2){
    	if (f1.nome == f2.nome){

    		System.out.println("Iguais");

    	}else {
    		System.out.println("Diferentes");
    	}
    	if (f1.salario == f2.salario){

    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");

    	}
    	if (f1.departamento == f2.departamento){

    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    	if (f1.dataDeEntrada == f2.dataDeEntrada){
    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    	if (f1.RG == f2.RG){
    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    }

Na classe TestaFuncionário, como definir os parametros de forma correta para ele fazer a comparação:

f2.compara();

Agradeço desde já pela ajuda.
Rafael.

você não está pensando orientado a objetos, o método compara() é de funcionário, certo?

então você vai comparar um objeto que você ja tem (que está invocando o método) com algum outro objeto.
A declaração dele tem que ser assim: public boolean compara(Funcionario outro){ if (this.nome.equals(f2.nome)){ System.out.println("Iguais"); }else { // Continuação } }entendeu?
aí no main faça assim:public static void main(String[] args){ Funcionario f1 = new Funcionario(); Funcionario f2 = new Funcionario(); System.out.println(f1.compara(f2)); }

Obrigado Rodrigo,

Mas agora estou tendo um erro de referenciamento no método compara, pois f2.salario é do tipo double.

public boolean compara(Funcionario outro, Funcionario f2){
    	if (this.nome.equals(f2.nome)){

    		System.out.println("Iguais");

    	}else {
    		System.out.println("Diferentes");
    	}
    	if (this.salario.equals(f2.salario)){

    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");

    	}
    	if (this.departamento.equals(f2.departamento)){

    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    	if (this.dataDeEntrada.equals(f2.dataDeEntrada)){
    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    	if (this.RG.equals(f2.RG)){
    		System.out.println("Iguais");
    	}else{
    		System.out.println("Diferentes");
    	}
    }

Tentei mudando f2.salario para o tipo float mas o erro continua, visto que o exercício solicita manter o f2.salario como double, como poderia fazer essa comparação ?

Obrigado,
Rafael.

O método .equals() não apenas usado para fazer comparação de strings? Só uma dúvida mesmo.

Postar a exception ai ajuda tbm …

Bom eu sou novato e tenho 13 anos mais acho que sei qual é o problema:
(corrigi coloquei virgula em vez de && XD).
quando você coloca:

[code]public void compara(boolean f1,boolean f2){
if (f1 == f2){

		System.out.println("Iguais");

	}else {
		System.out.println("Diferentes");
	}
} [/code]

o sistema vai comparar os locais aonde o objeto esta guardado, pois f1 e f2 são duas referencias diferentes( se esse for o caso não sei, daria sempre false) , eu acho que o certo seria fazer o seguinte:

[code]
public void compara(boolean f1,boolean f2){
if (f1.nome == f2.nome){

		System.out.println("Iguais");

	}else {
		System.out.println("Diferentes");
	}
} [/code]

ai você faz um if que compara se todos são iguais,(coloca tudo dentro de apenas um if) caso tudo seja igual vai dar “iguais” caso tudo for diferente vai dar “diferentes” ai caso tenha apenas uma variável diferente já vai dar que o funcionário é diferente do outro, acho que fica mais ou menos assim:

[code]
if (f1.nome == f2.nome && f1.(outravariavelaqui) == f2.(outravariavelaqui) && f1.(outravariavelaqui) == f2.(outravariavelaqui)){
/* e assim por diante, ai você coloca todas as variáveis dentro deste if e se todas estiverem iguais vai dar o “iguais” XD acho que é isso */
System.out.println(“Iguais”);

	}else {
		System.out.println("Diferentes");
	}
} [/code]

Se eu estiver errado me corrijam XD.

[quote=jrbonilha]Boa Tarde Pessoal,

Fazendo a implementação do método compara, o mesmo reporta erros ao fazer o teste na classe TestaFuncionario:

Meu código do método compara:


 public void compara(boolean f1,boolean f2){
    	if (f1 == f2){

    		System.out.println("Iguais");

    	}else {
    		System.out.println("Diferentes");
    	}
    }

Minha classe TestaFuncionario:


public class TestaFuncionario{

		public static void main (String [] args){
		Funcionario f1 = new Funcionario();
		f1.nome = "Rafael";
		f1.salario = 1000.00;
		f1.departamento = "TI";
		f1.dataDeEntrada = "08022011";
		f1.RG = "264469479";
		f1.atendePessoas(false, false);
		f1.bonifica(80);
		f1.mostra();


		Funcionario f2 = new Funcionario();
		f2.nome = "Rafael";
		f2.salario = 1000.00;
		f2.departamento = "TI";
		f2.dataDeEntrada = "08022011";
		f2.RG = "264469479";
		f2.atendePessoas(false, false);
		f2.bonifica(80);
		f2.mostra();

		f2.compara(true, true);



		}
}

Quando eu altero o valor de f2.compara para (true, false), o mesmo retorna que os usuários são diferentes, sendo que os mesmos estão iguais. Se utilizo valores do tipo String no método compara, volta uma mensagem de erro ao fazer a comparação. Estou achando estranho isso, pois para mim parece que tenho que usar um valor booleano, mas o operador == não é compatível com esse tipo de valor, correto?

Agradeço desde já pela ajuda.
Rafael.
[/quote]

Fiz um exemplo para você ver olha:

[code]
int a = 500;
int b = 500;
int c = 600;
int d = 600;
int e = 700;
int f = 700;

    if ( a == b && c == d && e ==f) {
    System.out.println("iguais");
} else {
    System.out.println("diferentes");    
    }[/code]

Ao dizer f1.nome, f2.nome, vocÊ quer dizer .getNome né ?
Enfim, compara f1 com f2 realmente não compara valores. É quenem comparar strings, onde temos que colocar equals.

Então, tens que verificar um por um,ai antes você cria um boolean e seta como true, cado alguma informações não ‘bata’ nos seus ifs, coloque seu boolean como false…

Vou alterar seu próprio método pra te dar um exemplo

public boolean compara(Funcionario f2){ // Note que removi um parâmetro if (this.nome.equals(f2.nome) && this.salario.equals(f2.salario) && this.salario.equals(f2.salario) && this.departamento.equals(f2.departamento) && this.dataDeEntrada.equals(f2.dataDeEntrada) && this.RG.equals(f2.RG)){ System.out.println("Iguais"); return true; }else{ System.out.println("Diferentes"); return false; } }tem muita coisa que poderia ser melhorada nesse método, esse exemplo é só pra te dar uma idéia.

[quote=gabriel-java] Fiz um exemplo para você ver olha:

[code]
int a = 500;
int b = 500;
int c = 600;
int d = 600;
int e = 700;
int f = 700;

    if ( a == b && c == d && e ==f) {
    System.out.println("iguais");
} else {
    System.out.println("diferentes");    
    }[/code][/quote]

Só lembrando que ai comparam-se diretamente variáveis. Nosso amigo tem que comparar objetos que possuem variáveis.

[quote=William Ricardo][quote=gabriel-java] Fiz um exemplo para você ver olha:

[code]
int a = 500;
int b = 500;
int c = 600;
int d = 600;
int e = 700;
int f = 700;

    if ( a == b && c == d && e ==f) {
    System.out.println("iguais");
} else {
    System.out.println("diferentes");    
    }[/code][/quote]

Só lembrando que ai comparam-se diretamente variáveis. Nosso amigo tem que comparar objetos que possuem variáveis.[/quote]

Sim porem eu creio que dá para comparar os objetos naturalmente XD.

Dar até dá, mas comparar objetos com == pode não retornar o resultado esperado, pois você estará comparando os endereços de memória das referências, e não os atributos que você definiu.

Só se compara com == quando você quer saber se as 2 referências estão apontando para o mesmo endereço de memória.

Um exemplo pra clarificar:[code] public static void main(String[] args){
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1); // imprime java.lang.Object@19821f
System.out.println(obj2); // imprime java.lang.Object@addbf1
System.out.println(obj1 == obj2); //imprime false

	obj1 = obj2;
	System.out.println(obj1); // imprime java.lang.Object@addbf1
	System.out.println(obj2); // imprime java.lang.Object@addbf1
	System.out.println(obj1 == obj2); //imprime true
}[/code]

Sobre isso eu já sei :slight_smile: que por exemplo o objeto a e o objeto b se comparados vai dar false pois estão guardados em locais diferentes, eu não estou falando para ele comparar objetos e sim variáveis pois quando você coloca a.(variável) == b.(variável) você está comparando as variáveis e não os objetos é isso o que eu quero mostrar a ele entende? XD

Dar até dá, mas comparar objetos com == pode não retornar o resultado esperado, pois você estará comparando os endereços de memória das referências, e não os atributos que você definiu.

Só se compara com == quando você quer saber se as 2 referências estão apontando para o mesmo endereço de memória.

Um exemplo pra clarificar:[code] public static void main(String[] args){
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1); // imprime java.lang.Object@19821f
System.out.println(obj2); // imprime java.lang.Object@addbf1
System.out.println(obj1 == obj2); //imprime false

	obj1 = obj2;
	System.out.println(obj1); // imprime java.lang.Object@addbf1
	System.out.println(obj2); // imprime java.lang.Object@addbf1
	System.out.println(obj1 == obj2); //imprime true
}[/code][/quote]

ok valeu então eu fiz outro exemplo para corrigir e ficar melhor XD kkkk :

//classe:
class Retangulo {
     
      int largura;
      int altura;
      String nome;
}

// classe principal onde executa :
public static void main(String[] args) {
        Retangulo a = new Retangulo();
        Retangulo b = new Retangulo();
        
        a.altura = 5;
        a.largura = 6;
        a.nome = "joão";
        
        b.altura = 5;
        b.largura = 6;
        b.nome = "joão";
        
        if( a.altura == b.altura && a.largura == b.largura &&
                a.nome.equals(b.nome)) {
            System.out.println("iguais");
        } else {
            System.out.println("diferentes");
        }
    }

Eu já testei dá muito certo se você modificar um valor até na String da diferentes se ficar tudo igual dá iguais ta certinho, e fica muito mais pratico do que criar vários if e amigo é esse tipo de coisa que diferencia um bom programador de um mal programador se você colocar no seu programa inteiro vários if sendo que poderia apenas fazer um seu programa vai ficar mais pesado e lento do que um com apenas o if preciso, estou certo né? Bom é isso!
Pronto! XD :slight_smile:

Só uma questão, esse problema ja foi resolvido ou ainda não, pois ja foram apresentadas varias soluções possíveis e o autor da pergunta ainda não se pronunciou sobre os testes relacionados aos mesmos.
Em caso afirmativo, peço encarecidamente que o tópico seja marcado como resolvido.
Senão, peço ao autor que use o PrintStack e retorne a mensagem que o erro esta gerando para facilitar a resolução de sua dúvida.

Muito obrigado pela atenção e até logo.

Att.: Raytek.

Pessoal,

Segue a exception que está ocorrendo com o código:

double cannot be dereferenced em:


&& this.salario.equals(f2.salario)

Obrigado pela ajuda.

Abraços,
Rafael.