• ich verwende eine hashmap um eine finite-statemashine abzubilden

    Code
    private HashMap<AbstractState, Vector<AbstractState>> transitions = new HashMap<AbstractState, Vector<AbstractState>>();

    es gibt mehrere states, die alle von AbstractState erben:

    das problem ist nun, dass die hashmap zwei instanzen einer state-klasse nicht als gleich ansieht (ich hab den hashcode von zwei instanzen der selben klasse verglichen, sie sind ident), und ich somit bei transitions.get( state ) ständig null kriege.

    versteht das jmd?
    habe ich was nicht bedacht?

    danke im vorraus.

    keep da fire burnin'

  • In einer HashMap werden die hashCodes der Schluesselwerte zwar zum abspeichern und suchen verwendet. Aber um sicher zu gehen, dass sich das gesuchte Objekt tatsaechlich in der Map befindet, wird die equals methode verwendet.

    Das eine impliziert das andere naemlich nicht:

    Zitat von http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#hashCode()


    It is not required that if two objects are unequal according to the equals(java.lang.Object) 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 hashtables.

    Du solltest daher auch die equals Methode von AbstractState ueberschreiben.

    Hier noch ein entsprechender Test:

    Ich frage mich aber, ob man das wirklich so loesen sollte. Anstatt die States fuer die Map ueber ihre Klassen zu vergleichen, koenntest du ja z.b. auch gleich die Klassen als Keys benutzen:

    PHP
    map.put(StateA.class, "C");
  • Danke für die Hilfe!!
    Hab zwar equals überschrieben, aber das hatte offenbar einen Bug...

    Zitat von a9bejo

    Ich frage mich aber, ob man das wirklich so loesen sollte. Anstatt die States fuer die Map ueber ihre Klassen zu vergleichen, koenntest du ja z.b. auch gleich die Klassen als Keys benutzen:

    PHP
    map.put(StateA.class, "C");


    Stimmt das wäre auf jeden Fall besser. Allerdings: ich verwende die Map um mögliche Nachfolge-Zustände abzubilden - da kann natürlich ein State mehrmals vorkommen, wodurch ich wieder das Problem von mehreren Instanzen hab. Das könnte man zwar umgehen, aber da das nur eine kleine Test-App sein soll, will ich mir da nicht so viel antun.

    keep da fire burnin'

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!