public Person findPersonByName(String name) throws PersonException {
Person p1 = new Person("a", 10); // a und b müssen eindeutig sein
Person p2 = new Person("b", 11);
Person p2 = new Person("b", 11); // sollte nicht gehen, oder soll ich zum Set greifen? Die Anforderung ist aber, dass name *eindeutig* sein muss :-)
persons.add(p1);
persons.add(p2);
List<Person> persons = ArrayList<>();
for (person : persons) {
if (name.contains(name)) {
return person
} else {
throw new PersonException();
}
}
return null;
}
Set
halten mit allen bereits vergebenen Namen in dem du dann nachschaust ob dieser Name bereits verwendet wurden.Willst du bereits verhindern, dass die "doppelte" Person erzeugt werden kann?unique
für die spätere Implementieruntg so etwa (schnell getippt):
Java:Person p1 = new Person("a", 10); // a und b müssen eindeutig sein Person p2 = new Person("b", 11); Person p2 = new Person("b", 11); // sollte nicht gehen, oder soll ich zum Set greifen? Die Anforderung ist aber, dass name *eindeutig* sein muss :-)
class Persons {
private Set<String> names = new HashSet<>();
private List<Person> persons = new ArrayList<>();
public boolean add(Person person) {
// Prüfe vor dem Hinzufügen der Person, ob der Name bereits vorhanden ist
}
// ...
}
Set<Person>
verwenden, sofern dir die Methoden, die Set anbietet ausreichen. Aufpassen: In dem Fall muss die Klasse Person sowohl equals() als auch hashCode() überschreiben!vielen Dank, ich habe Person#equals überschrieben
Warum hashCode() überschreiben, habe ich noch nicht verstanden?
Da ist die Antwort einfach: Wenn Du on anderen Klassen ableitest, musst der "Vertrag" eingehalten werden. Jedes abgeleitete Objekt muss sich so verhalten, wie das, wovon abgeleitet wurde (Siehe dazu Liskovs Substitution Principle).Warum hashCode() überschreiben
The general contract of hashCode is:
- Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
- If two objects are equal according to the equals method, then calling the hashCode method on each of the two objects must produce the same integer result.
- It is not required that if two objects are unequal according to the equals method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.
Bei Hash-Umsetzungen hängt das stark davon ab, wie der Hashcode implementiert ist. Überschreibt man ihn nicht und es kommt immer die selbe Zahl, so landet alles im selben Container und das Ganze ist ähnlich schnell/langsam wie eine Liste. Nur wenn bekannt ist, wo das Element sich befindet, ohne irgendwas durchiterieren zu müssen, sind wie bei O(1).Ein kleiner Hinweis (am Rande): Das funktioniert natürlich auch ohne das HashSet, indem du vor dem Hinzufügen prüfst, ob die Person schon in der Liste ist. Die HashSet.contains() Methode arbeitet allerdings in O(1), während für ArrayList.contains() O(n) gilt.
Die default HashCode Methode gibt nicht einen konstanten Wert zurück. Was da beschrieben wurde ist, dass wenn auf einer konkreten Instanz mit einem Zustand mehrmals HashCode aufgerufen wird immer der gleiche Wert zurück gegeben wird.was auch die default-Umsetzung ist (es sei denn, ich interpretiere einen der Punkte falsch)
Wenn ich mich jetzt nicht komplett täusche, ist der default hashcode oben nicht konstantwas auch die default-Umsetzung ist
was auch die default-Umsetzung ist
As much as is reasonably practical, the hashCode method defined by class Object does return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the JavaTM programming language.)
Wurde mir im Forum hier so gesagt, nachdem ich was anderes behauptet hatteWenn ich mich jetzt nicht komplett täusche, ist der default hashcode oben nicht konstant
Wer hat das wo gesagt? Das würde mich schon interessieren. Zumal das ja sehr offensichtlich ist, denn der Hashcode wird ja auch in der default toString Methode verwendet und da sieht man ja immer wieder andere Hex-Zahlen.Wurde mir im Forum hier so gesagt