# die einzelnen Attribute einzeln vergleichen



## babuschka (4. Nov 2009)

Hallo Community,
wie kann ich jetzt die einzelnen Attributen einzeln vergleichen?

das habe ich bis jetzt programmiert:

```
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Person p1 = new Person("Mueller", "Hans", 22);
        Person p2 = new Person("Mueller", "Hans", 22);
        p1.istGleich(p2);
        
        p1.drucke();
        p2.drucke();

        System.out.println(p1 == p2);

    //p1==p2 ist false. Sie haben zwar den gleichen Inhalt haben aber Sie befinden
    //sich nicht in der selben Referenz!!!
    }

    class Objekte {
    }
}

class Person {

    String nachname;
    String vorname;
    int alter;

    Person(String vorname, String nachname, int alter) {

        this.vorname = vorname;
        this.nachname = nachname;
        this.alter = alter;

    }

    public void drucke() {
        System.out.println("Nachname: " + nachname + " Vorname" + vorname + " Alter " + alter);
    }




    public static boolean istGleich(Person personObjekt) {               //Uebung4_4
        boolean stimmtnicht=false;
        
        if(?????){   <<----
        }
        return stimmtnicht;
        

    }
}
```


----------



## venomicious (4. Nov 2009)

strings vergleichst du mit der methode compareTo und das alter kannst du mit dem vergleichsoperator == überprüfen.


----------



## hdi (4. Nov 2009)

Kommt auf den Datentyp des Attributes an. Primitve Typen kann man mit == vergleichen, Objekte mit equals(). Das ist für alle Klassen der API implementiert. Für _eigene _Klassen musst du die equals()-Methode überschreiben, und sinnig implementieren. Also nur, wenn du eben nicht einzelne Attribute vergleichen willst, sondern einfach wissen willst ob 2 Personen gleich sind. zB:


```
class Person {

   //...

public boolean equals(Object o){
     if(!(o instanceof Person)){
         return false;
     }
     return ((Person)o).vorname.equals(this.vorname) && (Person)o).nachname.equals(this.nachname) && (Person)o).alter == this.alter);
}
```


----------



## babuschka (4. Nov 2009)

ja aber was vergleichen? ich meine wie was kommt vor dem Punkt und in die Klammer rein?

bsp:

?.equals(?)


----------



## Metacoder (4. Nov 2009)

FBI_1907 hat gesagt.:


> ja aber was vergleichen? ich meine wie was kommt vor dem Punkt und in die Klammer rein?
> 
> bsp:
> 
> ?.equals(?)



if (personInstanz1.equals(personInstanz2)) {
  //beide Instanzen logisch gleich
}


----------



## KrokoDiehl (4. Nov 2009)

Du musst doch festlegen, was die Gleichheit zweier Personen ausmacht. Genügt der gleiche Nachname, genügt Gleichheit in Vor- und Nachname ... oder oder oder.

Mit 
	
	
	
	





```
equals()
```
 (sofern noch nicht überschrieben) kannst du herausfinden, ob es die gleichen Objekte sind, wie _Metacoder_ bereits gesagt hat. In dem Fall sind sie auf jeden Fall gleich.
Wenn du aber inhaltlich vergleichen willst, ob zwei verschiedene(!) Objekte die gleiche Person beschreiben, musst du ihre Attribute vergleichen. Etwa derart:

```
if ( person1.getVorname().compareTo( person2.getVorname() ) == 0 &&
     person1.getNachname().compareTo( person2.getNachname() ) == 0 &&
     person1.getAlter() == person2.getAlter() )
{
    // beide gleich
}
else
{
    // ungleich
}
```


----------



## Metacoder (4. Nov 2009)

KrokoDiehl hat gesagt.:


> Mit
> 
> 
> 
> ...



Ist equals nicht überschrieben, sind sie auf jeden Fall ungleich!
Es handelt sich um zwei unterschiedliche Instanzen der Klasse Person (personInstanz1 und personInstanz2).
Wird equals überschrieben und darin die Felder verglichen, die die *logische* Identität der Instanz ausmachen (z.B. Vorname, Nachname), 
dann kann equals sinnvoll angewendet werden!

Und nicht vergessen hashCode auch zu überschreiben (z.B. wenn die Klasse in eine Collection einfügen werden soll)!


----------



## babuschka (4. Nov 2009)

ja aber bei mir zeigt fehler an. Instanzen können nicht gefunden werden also in diesem fall p1 und p2 wie soll das gehen? Außedem hab ich doch kein set wie soll ich dann get verlangen?


----------



## Metacoder (4. Nov 2009)

FBI_1907 hat gesagt.:


> ja aber bei mir zeigt fehler an. Instanzen können nicht gefunden werden also in diesem fall p1 und p2 wie soll das gehen? Außedem hab ich doch kein set wie soll ich dann get verlangen?



Sorry, mit den dünnen Informationen kann zumindest ich Dir nicht weiterhelfen.
Set haben => get verlangen ???:L 	:bahnhof:


----------



## babuschka (4. Nov 2009)

Metacoder hat gesagt.:


> Sorry, mit den dünnen Informationen kann zumindest ich Dir nicht weiterhelfen.
> Set haben => get verlangen ???:L 	:bahnhof:



Aufgabe lautet:

gelöscht


----------



## KrokoDiehl (4. Nov 2009)

Na das allermeiste hast du ja schon:

```
public static boolean istGleich(Person personObjekt) {               //Uebung4_4
        boolean stimmtnicht=false;
        
        if(?????){   <<----
        }
        return stimmtnicht;
        
 
    }
```
Und darin musst du nun den vergleich beider Personen implementieren. Und jetzt frag nicht, welche beiden Personen oder wie du an ihre Attribute kommst... 
Die Lösung befindet sich sogar schon in diesem Thread.


----------

