Map

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje

Iskalna tabela (Map) predstavlja tabelo parov <ključ,vrednost>, ki omogoča učinkovito iskanje vrednosti po ključih.

V angleščini jo imenujemo

  • Hash (v Perl jeziku)
  • map
  • lookup table
  • associative array
  • dictionary

Vsebina

Ključi

  • ključi so enolični (se ne smejo ponavljati)
  • lahko so poljubnega tipa (ne nujno celoštevilski)

Primer ključa: vpisna številka

Vrednosti

Vrednosti vsebujejo podatke

Primer vrednosti: objekt tipa študent z vsebino

Primeri:

  • slovar
niz(beseda),niz(pomen)
  • legenda
barva,pomen
  • kazalo
poglavje,podpoglavje
  • seznam lokacij
lokacija,ime

Collection Framework

Collection Framework vsebuje:

  • generični vmesnika Map in SortedMap
Map je bolj splošen
SortedMap je urejena iskalna tabela
  • generični abstraktni razred AbstractMap
  • več realiziranih generičnih razredov:
  • HashMap
  • TreeMap
  • WeakHashMap
public interface Map
  { int size();
    boolean isEmpty(); //ali je prazen ali ne
    boolean containsKey(Object k);     //pove ali obstaja nek kljuc
    boolean containsValue(Object v);   //pove ali obstaja vrednost
    Object get(Object k);              //vrne kljuc
    Object put (Object k, Object v);   //metoda za dodajanje
    Object remove(Object k);           //odstranjevanje po kljucu
    putAll(Map);   //doda celo iskalno tabelo
    clear();       //izprazni
    Set keySet();    //vrne mnozico kljucev
    Set entrySet();  //vrne mnozico parov
    ...
    Collection values(); //vrne zbirko vrednosti (ni mnozica ker omogoca ponavljanje)
 
  public interface Entry {   //vmesnik za 1 par
    Object getKey();           //vrne kljuc
    Object getvalue();         //vrne vrednost
    Object setValue(Object v);  //nastavi vrednost
    boolean equals(Object o);   //preveri enakost 2 parov
    int hashCode();            //hash koda para
  }
  boolean equals(Object o);  //preveri enakost 2 iskalnih tabel
  int hashCode();          //hash koda celote
}

HashMap

Razred HashMap

  • realizacija z (zaprto) razpršeno tabelo (hash table)
  • v ozadju tabela določene kapacitete
  • razporejanje s pomočjo razpršilne funkcije:
  • zagotavlja hitro vstavljanje in iskanje
  • problem kolizij:
  • linerno ponovno razprševanje
  • kvadratično ponovno razprševanje
  • odprte razpršene tabele
  • zagotavljanje primerne kapacitete in zasedenosti

Primer

Prikaz razprševanja v Javi

slovensko – angleški slovar
import java.util.*;
public class Slovar {
  public static void main(String[] args) {
 
    Map<String,String> slovar = new HashMap<String,String>();
 
    slovar.put("day","dan");
    slovar.put("ear","uho");
    slovar.put("hat","klobuk");
    slovar.put("one","ena");
    slovar.put("six","sest");
    slovar.put("ten","deset");
    slovar.put("two","dva");
    slovar.put("yes","da");
 
    System.out.println("Slovar: "+slovar);
 
    System.out.println("Velikost: "+ slovar.size());
    System.out.println("Slovar.keySet(): "+ slovar.keySet());
    System.out.println("Slovar.values(): "+ slovar.values());
    System.out.println("Slovar.entrySet(): "+ slovar.entrySet());
    System.out.println("Slovar.get(one): "+ slovar.get("one"));
    System.out.println("Slovar.remove(one): "+ slovar.remove("one"));
    System.out.println("Slovar.get(one): "+ slovar.get("one"));
 
    System.out.println("Slovar: "+slovar);
    System.out.println("Velikost: "+ slovar.size());
 
    //System.out.println("Slovar.put(six,6): "+ slovar.put("six",new Integer(6)));
    System.out.println("Slovar.put(six,sestica): "+ slovar.put("six","sestica"));
    System.out.println("Slovar.put(yes,null): "+ slovar.put("yes",null));
    System.out.println("Slovar.put(null,dva): "+ slovar.put(null,"dva"));
 
    System.out.println("Slovar: "+slovar);
    System.out.println("Velikost: "+ slovar.size());
 
    System.out.println();
 
    Map<String,String> slovar1 = new HashMap<String,String>();
 
    slovar1.put("yes","da");
    slovar1.put("two","dva");
    slovar1.put("ten","deset");
    slovar1.put("six","sest");
    slovar1.put("one","ena");
    slovar1.put("hat","klobuk");
    slovar1.put("ear","uho");
    slovar1.put("day","dan");
 
    System.out.println("Slovar1: "+slovar1);
 
    print("yes");
    print("two");
    print("ten");
    print("six");
    print("one");
    print("hat");
    print("ear");
    print("day");
 
    Map<String,String> slovar2 = new TreeMap<String,String>();
 
    slovar2.put("yes","da");
    slovar2.put("two","dva");
    slovar2.put("ten","deset");
    slovar2.put("six","sest");
    slovar2.put("one","ena");
    slovar2.put("hat","klobuk");
    slovar2.put("ear","uho");
    slovar2.put("day","dan");
 
    System.out.println("Slovar2: "+slovar2);
  }
 
  public static void print(String s) {
    final int MASK= 0x7FFFFFFF; //2**32-1
    final int CAPACITY = 16;
    System.out.println(s+" - "+s.hashCode()+" : "+(s.hashCode()&MASK)%CAPACITY);
  }
}

TreeMap

Razred TreeMap

  • realizacija z dvojiškim iskalnim drevesom
  • v ozadju ustrezno povezano drevo objektov
  • upošteva urejenost po ključih – izpis

Primer uporabe: kazalo

WeakHashMap

Razred WeakHashMap

  • realizacija s šibkimi razpršenimi tabelami
  • ko ključ (ali vrednost) ni več dosegljiv, se element odstani iz tabele

Primer uporabe: seznam datotek na disku ...

Vzpostavljeno iz »http://www.e-studij.si/Map«
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja