Avatar billede jens426 Nybegynder
25. januar 2012 - 08:38 Der er 5 kommentarer og
1 løsning

hashmap forviring

ordbog hvor jeg kan tjekke om et ord er i ordbogen, der skal ikke kunne sættes nye ord i bogen, kun tjekke om ordet eksistere.

  HashMap hashMap = new HashMap();
   
        HashMap HashMap = new HashMap();

        HashMap HashMap = new HashMap(Map myMap);
        hashMap.put("en", new Boolean(true));
        hashMap.put("to", new Boolean(true));
        hashMap.put("tre", new Boolean(true));

if( hashMap.containsKey("en") ) // den er der

spørgsmål
som jeg opfatter det vil der blive lavet en haskode af "en" og der tjekkes om denne hashkode er i mappen.
Men hvad hvis if( hashMap.containsKey("fem") ) hashkoden af "fem" er lig haskoden af "en" vil det resultere i true eller er der noget jeg har misforstået.
Avatar billede arne_v Ekspert
25. januar 2012 - 14:21 #1
Der er noget du har misforstaaet.

:-)

containsKey vil foerste lede efter keys med samme hash

ingen fundet => returner false

nogen fundet => sammenlign strengen for de fundne med det der ledes efter og returner true hvis match ellers false
Avatar billede arne_v Ekspert
25. januar 2012 - 18:55 #2
Hvis value altid er true burde du nok bruge HashSet fremfor HashMap.
Avatar billede arne_v Ekspert
25. januar 2012 - 18:56 #3
Og forudsat at du bruger 1.5 eller nyere saa brug generics (og autoboxing hvis du fortsatter med HashMap).
Avatar billede jens426 Nybegynder
25. januar 2012 - 19:50 #4
ja meget behjælelig, hvis du vil have point, sendt et svar og ikke en kommentar og jeg giver dig kredit.
Avatar billede arne_v Ekspert
25. januar 2012 - 20:06 #5
svar
Avatar billede arne_v Ekspert
25. januar 2012 - 20:55 #6
Lad mig proeve at illustrere hvordan det virker med en hjemmestrikket hash tabel.


package hashtable;

public class PrimitiveHashTable<K,V> {
    private static class PrimitiveEntry<K,V> {
        private K key;
        private V value;
        private int index;
        public PrimitiveEntry(K key, V value) {
            this.key = key;
            this.value = value;
            this.index = -1;
        }
        public K getKey() {
            return key;
        }
        public V getValue() {
            return value;
        }
        public int getIndex() {
            return index;
        }
        public void setIndex(int index) {
            this.index = index;
        }
    }
    private int capacity;
    private PrimitiveEntry<K,V> table[];
    private int nextfree;
    public PrimitiveHashTable(int capacity) {
        this.capacity = capacity;
        this.table = new PrimitiveEntry[2 * capacity];
        this.nextfree = capacity;
    }
    public void put(K key, V value) {
        int  ix = key.hashCode() % capacity;
        if(table[ix] == null) {
            table[ix] = new PrimitiveEntry<K,V>(key, value);
        } else {
            if(nextfree >= table.length) throw new RuntimeException("Table is full");
            while(table[ix].getIndex() >= 0) ix = table[ix].getIndex();
            table[nextfree] = new PrimitiveEntry<K,V>(key, value);
            table[ix].setIndex(nextfree);
            nextfree++;
        }
    }
    public V get(K key) {
        int  ix = key.hashCode() % capacity;
        if(table[ix] == null) {
            return null;
        } else {
            while(ix >= 0) {
                if(table[ix].getKey().equals(key)) {
                    return table[ix].getValue();
                }
                ix = table[ix].getIndex();
            }
        }
        return null;
    }
}



package hashtable;

public class Test {
    public static void main(String[] args) {
        PrimitiveHashTable<String,Boolean> map = new PrimitiveHashTable<String,Boolean>(100);
        map.put("en", true);
        map.put("to", true);
        map.put("tre", true);
        System.out.println(map.get("to"));
        System.out.println(map.get("fire"));
        PrimitiveHashTable<Bad,Boolean> map2 = new PrimitiveHashTable<Bad,Boolean>(100);
        map2.put(new Bad("en"), true);
        map2.put(new Bad("to"), true);
        map2.put(new Bad("tre"), true);
        System.out.println(map2.get(new Bad("to")));
        System.out.println(map2.get(new Bad("fire")));
    }
}

class Bad {
    private String s;
    public Bad(String s) {
        this.s = s;
    }
    @Override
    public int hashCode() {
        return 42;
    }
    @Override
    public boolean equals(Object obj) {
        return obj != null && obj instanceof Bad && s.equals(((Bad)obj).s);
    }
    @Override
    public String toString() {
        return s;
    }
}


Java's er noget mere avanceret, men den her skulle vise ideen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester