1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

HashMap

  • burny
  • 22. April 2006 um 19:50
  • Unerledigt
  • burny
    7
    burny
    Mitglied
    Punkte
    460
    Beiträge
    71
    • 22. April 2006 um 19:50
    • #1

    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:

    Code
    ...
    @Override
    	public int hashCode() {
    		// int hashCode = (this.getLogLevel() + ":" + this.getLogMessage()).hashCode();
    		int hashCode = this.getClass().hashCode();
    
    		System.out.println( "hashCode:" + hashCode );
    
    		return hashCode;
    	}
    ...
    Alles anzeigen

    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'

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 23. April 2006 um 00:39
    • #2

    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:

    PHP
    /*
     * Created on 23.04.2006
     * 
     * @author Benjamin Ferrari
     */
    package org.ferrari.tests;
    
    
    import java.util.HashMap;
    
    
    import junit.framework.Assert;
    import junit.framework.TestCase;
    
    
    /*es muessen hashCode _und_ equals implementiert werden*/
    class AbstractState {
    
    
      public int hashCode() {
        return this.getClass().hashCode();
      }
    
    
      public boolean equals(Object other) {
        return this.getClass().equals(other.getClass());
      }
    
    
    }
    
    
    class StateA extends AbstractState {}
    class StateB extends AbstractState {}
    
    
    public class StateTest extends TestCase {
    
    
      public void testMap() {
    
    
        Map<AbstractState, String> map = 
          new HashMap<AbstractState, String>();
        map.put(new StateA(), "A");
        map.put(new StateB(), "B");
        map.put(new StateA(), "C");
    
    
        Assert.assertEquals(map.size(), 2);
        Assert.assertTrue(map.containsKey(new StateA()));
        Assert.assertEquals(map.get(new StateA()), "C");
    
      }
    
    
    }
    Alles anzeigen

    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");

    lg, Benjamin Ferrari, bookworm.at

  • burny
    7
    burny
    Mitglied
    Punkte
    460
    Beiträge
    71
    • 23. April 2006 um 11:30
    • #3

    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'

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung