PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java - Auf bestimmtes Objekt zugreifen



Arythya
15.02.2016, 17:22
Wie kann ich auf ein Objekt mit einer bestimmten eindeutigen Variable zugreifen?
Hier ein Programmbeispiel:

class Point{
String name;
int x;
int y;

public Point(String name, int x, int y) {
this.name = name;
this.x = x;
this.y = y;
}
}
Wenn ich jetzt mehrere Objekte erstelle, zum Beispiel:

Point point1 = new Point(p1, 1, 1);
Point point2 = new Point(p2, 0, 1);
Point point3 = new Point(p3, 1, 0);
Der Name ist eindeutig, aber wie kann ich auf einen bestimmten Punkt über seinen Namen zugreifen?
Aber ohne die Klasse Point zu verwenden, die Frage ist allgemein für jede Art von Objekt gemeint.

Kellendil
15.02.2016, 20:38
Der Name ist eindeutig, aber wie kann ich auf einen bestimmten Punkt über seinen Namen zugreifen?

Möchtest du über den Punkt auf den Namen des Punktes zugreifen oder wirklich über den bekannten Namen auf einen von mehreren Punkten?

1. Fall:
Stickwörter: getter & setter, Sichtbarkeit
Du machts einen Getter für das attribut "name", dann kannst du diesen Getter aufrufen, um den Namen eines Punkt-Objektes zu bekommen.

2. Fall (deutlich fortgeschrittener):
Stichwörter: Array, Liste, Set, Hashmap, equals-Funktion, hashcode-Funktion
Normalerweise überschreibst du die hashcode- und equals-Methode in deinem Objekt, sodass equals den name vergleicht und hashcode den Hashcode von name zurück gibt.
Wenn man dann mehrere Punkte in eine Hashmap stopft, kann man einen Punkt herausholen, wenn man nur seinen namen weiß.

In Punkt:


public String getName() {return name;}
@Override
public boolean equals (Object o) {
if (o == null || !(o instanceof Punkt)) return false;
else return name.equals(((Punkt) o).getName());
}
@Override
public int hashcode() {return name.hashcode();}



Punkt p1 = new Punkt("Hallo");
HashMap<String, Punkt> punkte = new HashMap<>();
punkte.put(p1.getName(), p1);
Punkt p2 = punkte.get("Hallo"); // p1 == p2

Allerdings Vorsicht beim Ändern von Namen...

Alternativ zur Hashmap kannst du auch alle Punkte in ein Set stopfen, dann muss man durch das Set iterieren und bei jedem Punkt den Namen überprüfen.

Feuerstern
15.02.2016, 20:42
Du könntest die Objekte in einer Map speichern.
Als value würdest du in dem Falle den Point nehmen und als Key den Namen.



HashMap<String, Point> map = new HashMap<String, Point>();
Point point1 = new Point(p1, 1, 1);
Point point2 = new Point(p2, 0, 1);
Point point3 = new Point(p3, 1, 0);

map.put(point1.name, point1);
map.put(point2.name, point2);
map.put(point3.name, point3);

// Auf Objekt per Key Zugreifen
map.get(NameVomPunkt);


EDIT:
Da war ich wohl zu langsam §wink

Arythya
17.02.2016, 11:30
Danke an euch zwei :gratz
Was mache ich wenn der Schlüssel ein Objekt (in diesem Fall ein Punkt) ist?
Oder gibt es noch eine andere Möglichkeit wie ich in einer Map mehr als 2 Dinge speichern kann?

Meine Idee dazu:

HashMap<String, Point>map=new HashMap<String, Point>();
HashMap<HashMap, Integer>map2=new HashMap<HashMap, Integer>();

Dabei wird jedem Element aus map in map2 ein Integer Wert zugewiesen.
Und wie kann ich jetzt über den Punkt auf den zugehörigen Integer Wert zugreifen, der dem Punkt in map2 zugeordnet wird?
Macht es eigentlich einen Unterschied ob ich HashMap<String, Point>map=new HashMap<String, Point>(); durch Map<String, Point>map = new HashMap<String, Point>(); ersetze?

Kellendil
17.02.2016, 17:07
Zur zweiten Frage:
Dann hast du (von "außen" gesehen) ne Map, und kannst keine Funktionen benutzten die Hashmap hat, aber Map nicht. Ist also in diesem Fall egal, da du ehh keine Funkionen von Hashmap brauchst, die Map nicht hat.

Zur ersten:
HashMap<Hashmap, Integer> bedeutet, dass in deiner Hashmap Key-Value-Paare gespeichert sind wobei jeder Key eine komplette Hashmap ist und jede Value ein Integer. Glaube nicht dass das Sinn macht... da müsstest du ja jedesmal irgendwoher ne Hashmap bekommen, um damit den dazugehörogen Integer rauszuholen.

Wenn du mehrere Sachen als Key oder Value benutzten willst, musst du eine neue Klasse erstellen, die alles speichert was du brauchst, und die als Key oder Value benutzen. So wie deine Punkt-Klasse, die erlaubt es dir ja 2 Integer zu speichern. Ohne die Punkt-Klasse könntest du nur "Integer" als Value benutzten, also nur eine Zahl.

Edit: Wenn du wirklich Hashmaps verschachteln willst, solltest du ne HashTable benutzen (Tabelle), gibts z.B. in der Google Guava Library.

Arythya
18.02.2016, 16:12
Danke für die sehr ausführliche Antwort :gratz