# Java - Comparable / Collections



## Malimi (11. Jan 2013)

Hallo,

ich bin Anfänger im programmieren und bin gerade echt am verzweifeln bei der Bearbeitung folgender Aufgabe:

"Zunächst ist der Namens-Datentyp in der Klasse Name zu implementieren. Dieser soll einen Vor- und einen Nachnamen in Form von (unvera ̈nderlichen!) String-Objekten verwalten. Fu ̈r die Klasse sollen die
folgenden Methoden realisiert werden:

• Methode public boolean equals(Object obj)
Für den equals-Vergleich sind folgende Aspekte (in dieser Reihenfolge) zu pru ̈fen bzw. zu realisie- ren:
– ist die aktuelle Instanz und das u ̈bergebene Objekt gleich? (==) → ja: return true
– ist das u ̈bergebene Objekt null? → ja: return false
– entspricht die Klasse des u ̈bergebenen Objekts der Klasse des aktuellen (aufrufenden) Ob- jekts? → nein: return false
– Umwandeln/Casten des Objects obj in ein Name-Objekt.
– Sind die Nachnamen gleich? → nein: return false
– Sind die Vornamen gleich? → nein: return false
– return true, falls alle der vorherigen Vergleiche ohne Ru ̈ckgabe verlaufen sind.
Fu ̈r den Gleichheitsvergleich der Namen ist equals() fu ̈r die String-Objekte aufzurufen."

Ich weiß beim besten Willen nicht was ich machen muss und bin für jede Hilfe dankbar!
Daher schon ein mal im Vorhinein vielen Dank!


----------



## njans (11. Jan 2013)

Was ich da lese: Baue eine Klasse ,,Name'', welche 2 Strings enthält und equals überschreibt.


```
public class Name{

//...

public boolean equals(Object object){
//...
}

}
```


----------



## Malimi (11. Jan 2013)

Genau so weit hab ich das auch geschafft, das wars dann aber leider auch schon 
Mein Problem ist, dass ich nicht weiß, was ich bei dem public boolean equals machen muss...


----------



## Firephoenix (11. Jan 2013)

equals() und hashCode() richtig überschreiben : blog.buhbuhbuh.de

Gruß


----------



## nillehammer (11. Jan 2013)

Du hast die Anforderungen ja schon sehr detailiert aufgeschrieben. Da kann man fast eins zu eins aus jeder Zeile einen Anweisungsblock programmieren. Den ersten und letzten habe ich für Dich als Anstoß mal geschrieben:

```
public boolean equals(Object obj) {
  // ist die aktuelle Instanz und das u ̈bergebene Objekt gleich? (==) → ja: return true
  if(this == obj) {
    return true;
  }

  ... hier der Rest
  //– return true, falls alle der vorherigen Vergleiche ohne Ru ̈ckgabe verlaufen sind.
  return true;
}
```
Nach Begriffen wie Casten oder String.equals kann man googeln. Oder du liest Dir die folgenden beiden Artikel durch:
AngelikaLanger.com - Implementing the equals() Method - Part 1 - Angelika Langer Training/Consulting
AngelikaLanger.com - Implementing the equals() Method - Part 2 - Angelika Langer Training/Consulting


----------



## ARadauer (11. Jan 2013)

nillehammer hat gesagt.:


> Du hast die Anforderungen ja schon sehr detailiert aufgeschrieben.


naja er hat einfach seine Aufgabenstellung aus einen PDF kopiert... sieht man schön an Problemen bei den Umlauten "Fu ̈r den "


----------



## Malimi (13. Jan 2013)

Nur um den Beitrag dann zu schließen, hier die Methode, ich denke sie müsste soweit stimmen:


```
public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Name other = (Name) obj;
		if (nachname == null) {
			if (other.nachname != null)
				return false;
		} else if (!nachname.equals(other.nachname))
			return false;
		if (this.obj != other.obj)
			return false;
		if (vorname == null) {
			if (other.vorname != null)
				return false;
		} else if (!vorname.equals(other.vorname))
			return false;

		return true;
	}
```


----------



## nillehammer (17. Jan 2013)

Ja fast. Sie wird "nur" nicht kompilieren, wegen dem hier:
[JAVA=14]
        if (this.obj != other.obj)
            return false;
[/code]
von einer Instanzvariablen namens obj war nämlich bisher nicht die Rede. Deswegen glaube ich, dass es sie nicht gibt. Und sowas mag der Compiler nicht. Außerdem darf man sich auch als Mensch die Frage stellen: "Was macht dieses Konstrukt?" Da wird man dann auch ohne Compiler drauf kommen, dass es gelöscht gehört.

P.S. Ich weiß nicht, ob Ihr alle Klassen des JDK benutzen dürft, falls ja: Um diese häßlich verschachtelten ifs mit den null- und equals-Prüfungen zu vermeiden, kann man die Hilfs-Methode Objects.equals() verwenden. Der Code sieht dann so aus:

```
...
Name other = (Name) obj;
 
return Objects.equals(this.nachname, other.nachname) &&
       Objects.equals(this.vorname,other.nachname);
```
Sieht doch viel schöner aus, oder?

P.P.S Falls Ihr es nicht dürft, schreib Dir eine Hilfsmethode, die für zwei übergebene Objekte genau die Prüfungen macht. Rufe dann die auf.


----------

