Programmering för språkteknologer II, HT2014 Avancerad programmering för språkteknologer, HT2014 evelina.andersson@lingfil.uu.se Rum 9-2035 http://stp.ling.uu.se/~evelina/uv/uv14/pst2/
Idag - Hashtabeller - Kodkvalité - Objektorienterad analys - Övningar Komplexitet Objektorienterad analys/design 2
Hashtabeller 3
Associativa typer - En array associerar heltal med värden av godtycklig typ: String[] array = new String[4]; array[0] = "Kalle"; array[1] = "Anka"; array[2] = "Dator"; array[3] = "Bok"; Kalle Anka Dator Bok index: 0 1 2 3 4
Associativa typer - Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index. Exempel: Kalle Anka Dator Bok nyckel: K A D B 5
Associativa typer - Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index. Exempel: Kalle Anka Dator Bok nyckel: K A D B Problem: Hur ska datorn veta var i arrayen K finns? 6
Associativa typer - Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index. Exempel: Kalle Anka Dator Bok nyckel: K A D B Problem: Hur ska datorn veta var i arrayen K finns? Lösning: Konvertera K till ett giltigt index med hjälp av en hashfunktion. 7
Associativa typer - Tänk om vi kan associera värden av godtycklig typ med hjälp av ett godtyckligt värde, dvs en nyckel, istället för ett index. Exempel: s2 s3 s4 s5 hashfunktion: nyckel: K A D B Lösning: Konvertera K till ett giltigt index med hjälp av en hashfunktion. 8
Hashtabeller Skapa hashtabell 0 1 2 3 4 5 6 7 HashMap<String,String> Dictionary = new HashMap<String,String>(100); 9
Hashtabeller insättning K A D B Kalle Anka Dator Bok 0 1 2 K Kalle 3 4 5 6 7 Sätt in ordet Kalle i ordlistan. dictionary.put("k", "Kalle"); 10
Hashtabeller insättning K A D B Kalle Anka Dator Bok 0 1 2 K Kalle 3 4 5 A Anka 6 7 Sätt in ordet Anka i ordlistan. dictionary.put("a", "Anka"); 11
Hashtabeller insättning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 Sätt in ordet Dator i ordlistan. dictionary.put("d","dator"); 12
Hashtabeller insättning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Sätt in ordet Bok i ordlistan. dictionary.put("b", "Bok"); 13
Hashtabeller insättning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Nu har vi lagrat vår ordlista i hashtabellen. 14
Hashtabeller Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Hur kan vi hitta ordet Kalle? String state = dictionary.get("k"); 15
Hashtabeller Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Hur kan vi hitta ordet Anka? String state = dictionary.get("a"); 16
Hashtabeller Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Hur kan vi hitta ordet Dator? String state = dictionary.get("d"); 17
Hashtabeller Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 B Bok Hur kan vi hitta ordet Bok? String state = dictionary.get("b"); 18
Hashtabeller Fakta Skapa hashtabell: HashMap<K,V> name = new HashMap<K, V>(int capacity); Insättning: name.put(k key, V value); Sökning: V value = (V)name.get(K key); K står för key och kan vara av godtycklig typ V står för value och kan vara av godtycklig typ 19
Hashtabeller Krockhantering Vad händer om två nycklar får samma index i hashtabellen? 20
Hashtabeller Krockhantering K A D B Kalle Anka Dator Bok 0 1 2 K Kalle 3 4 5 6 7 dictionary.put("k","kalle"); 21
Hashtabeller Krockhantering K A D B Kalle Anka Dator Bok 0 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("a","anka"); 22
Hashtabeller Krockhantering K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("d","dator"); 23
Hashtabeller Krockhantering K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("b","bok"); 24
Hashtabeller Krockhantering K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("b","bok"); Index 2 i hashtabellen har redan ett värde, så nu blir det en krock. Hur ska vi lösa detta? 25
Hashtabeller Krockhantering Det finns olika sätt att lösa en krock - länkning - Varje plats i hashtabellen innehåller en länkad lista - öppen adressering - Placera datan på den första lediga platsen i hashtabellen 26
Hashtabeller Krockhantering länkning - Varje plats i hashtabellen innehåller en länkad lista K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("b","bok"); 27
Hashtabeller Krockhantering länkning - Varje plats i hashtabellen innehåller en länkad lista 0 D Dator K A D B Kalle Anka Dator Bok 1 2 K Kalle 3 4 5 A Anka B Bok 6 7 dictionary.put("b","bok"); 28
Hashtabeller Krockhantering Länkning: Sökning 0 D Dator K A D B Kalle Anka Dator Bok 1 2 K Kalle 3 4 5 A Anka B Bok 6 7 Vilket ord finns lagrat i nyckel B? String state = dictionary.get("b")); 29
Hashtabeller Krockhantering Länkning: Sökning 0 D Dator K A D B Kalle Anka Dator Bok 1 2 K Kalle 3 4 5 A Anka B Bok 6 7 Vilket ord finns lagrat i nyckel B? String state = dictionary.get("b")); 30
Hashtabeller Krockhantering Länkning: Sökning 0 D Dator K A D B Kalle Anka Dator Bok 1 2 K Kalle 3 4 5 A Anka B Bok 6 7 Vilket ord finns lagrat i nyckel B? String state = dictionary.get("b")); 31
Hashtabeller Krockhantering Länkning - insättning: - hashfunktionen används på nyckeln och vi får ett index i hashtabellen - nyckel + data placeras in i den enkellänkade listan i index - sökning: - hashfunktion används på nyckeln och vi får ett index - Man går igenom listan i index i tills: - data med motsvarande nyckel hittas och data returneras - eller tills listan är slut. Om listan är slut, returneras null. 32
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 4 5 A Anka 6 7 dictionary.put("b","bok"); 33
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 B Bok 4 5 A Anka 6 7 dictionary.put("b","bok"); 34
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. K Kalle A Anka D Dator B Bok S Stol 0 D Dator 1 2 K Kalle 3 B Bok 4 5 A Anka 6 7 dictionary.put("s","stol"); 35
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. K Kalle A Anka D Dator B Bok S Stol 0 D Dator 1 2 K Kalle 3 B Bok 4 5 A Anka 6 7 dictionary.put("s","stol"); 36
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. K Kalle A Anka D Dator B Bok S Stol 0 D Dator 1 2 K Kalle 3 B Bok 4 S Stol 5 A Anka 6 7 dictionary.put("s","stol"); 37
Hashtabeller Krockhantering Öppen adressering: Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 B Bok 4 S Stol 5 A Anka S Stol 6 7 dictionary.get("s"); 38
Hashtabeller Krockhantering Öppen adressering: Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 B Bok 4 S Stol 5 A Anka S Stol 6 7 dictionary.get("s"); 39
Hashtabeller Krockhantering Öppen adressering: Sökning K A D B Kalle Anka Dator Bok 0 D Dator 1 2 K Kalle 3 B Bok 4 S Stol 5 A Anka S Stol 6 7 dictionary.get("s"); 40
Hashtabeller Krockhantering Öppen adressering insättning: - applicera hashfunktionen på nyckeln och få ett index i hashtabellen - gå in i indexet och leta efter den första lediga platsen - placera nyckeln + datan på den platsen Sökning: - applicera hashfunktionen på nyckeln - leta efter nyckeln, om den hittas returneras värdet annars returneras null. 41
Hashtabeller Krockhantering Täthet - Risken för krockar ökar ju fler nycklar man placerat i hashtabellen. - Det tar längre tid att lägga in och söka efter nycklar i en hashtabell ju fler krockar man har. - Riktmärke: antal nycklar antal platser =0.75 42
Hashtabeller - JAVA Klasser: Hashtable, HashMap, HashSet Nycklarna lagras i osorterad ordning Krockhantering: Länkning TreeMap, TreeSet Nycklarna lagras i sorterad ordning Krav: Följande metoder måste implementeras: - int hashcode() omvandlar nyckeln till ett index som finns I hashtabellen - boolean equals(object other) returnerar sant om två objekt är lika annars falskt. 43
Hashtabeller - JAVA Konstruktorer: - HashXXX(); Kapacitet: 16 Täthet: 0.75 - HashXXX(int capacity); Kapacitet: capacity Täthet: 0.75 - HashXXX(int capacity, float loadfactor); Kapacitet: capacity Täthet: loadfactor 44
Hashtabeller - JAVA Konstruktorer: - TreeXXX(); Skapar ett tomt träd - TreeXXX(Collection<? extends E> c) Skapar ett nytt träd som innehåller samma object som c - TreeXXX(Comparator<? super E> comparator) Skapar ett nytt tomt träd sorterad enligt comparator - TreeXXX(SortedSet<E> s) Skapar ett nytt träd med samma innehåll som i s 45
Hashtabeller - JAVA Klasser: Hashtable, HashMap, HashSet - När antalet element i hashtabellen överstiger kapaciteten gånger täthetsfaktorn, utökas tabellen. - Detta tar tid och ska därför inte göras ofta. - Täthetsfaktorn kan användas för att balansera uttrymmet mot effektiviteten. 46
Hashtabeller - JAVA Klasser: Hashtable, HashMap, HashSet - Krockhantering: Länkning - För att objekt av en klass ska kunna placeras i en hashtabell måste man implementera följande: - int hashcode() - Avgör i vilket index en nyckel ska placeras i - boolean equals(object other) - Finns definierad i objekt - Avgör om två nycklar är lika 47
Hashtabeller - JAVA int hashcode() - Två objekt som är lika enligt equals ska få samma hashcode - Två objekt som inte är lika enligt equals behöver inte få samma hashcode - Strategier: - Linjär sökning: ett steg i taget - Kvadratisk sökning: 1, 2, 4,8 16,... - Dubbelhashning: en ytterliggare hashfunktion avgör hur många steg som ska tas 48
Klassen String - boolean equals(object o) Jämför alltid strängar med equals, istället för string1 == string2. Exempel: String string = "Hej"; if(string.equals("hej")) { System.out.println("Same string"); } else { System.out.println("Not the same string"); } 49
Hashtabeller - JAVA boolean equals(object o) - Ta reda på om två objekt är lika (jämför == för värden) - Exempel: public class Person{ String name = ""; } public boolean equals (Object o) { if(this == o) return true; // samma objekt 50
Hashtabeller - JAVA boolean equals(object o) - Ta reda på om två objekt är lika (jämför == för värden) - Exempel: public class Person{ String name = ""; } public boolean equals (Object o) { if(this == o) return true; // samma objekt // Testa om o inte är en instans av Person else if (!(o instanceof Person)) return false; o instanceof klassnamn returnerar sant om o är en instans av klassen klassnamn, annars returneras falskt. 51
Hashtabeller - JAVA boolean equals(object o) - Ta reda på om två objekt är lika (jämför == för värden) - Exempel: public class Person{ String name = ""; public boolean equals (Object o) { if(this == o) return true; // samma objekt // Testa om o inte är en instans av Person else if (!(o instanceof Person)) return false; else { // Testa om instansvariablerna har // samma värde Person operson = (Person)o; return name == operson.name; } } } 52
Kodkvalité 53
Kodkvalité - Namn - namnet på en variabel ska beskriva vad som finns lagrat i den Ex. String name; är bättre än String n; - namnet på en metod ska beskriva vad metoden utför för något Ex. String getname(); är bättre än String getn(); 54
Kodkvalité Koden i metoderna - Om ni har flera satser som utföra ungefär samma sak: Samla satserna i en metod och anropa den istället Då blir det lättare att underhålla koden om ni behöver göra ändringar i den. Exempel: Det är lättare att göra ändringar i en metod som anropas flera gånger istället för att leta efter snarlika kodblock och ändra på var och en av dem. 55
Kodkvalité Koden i metoderna - Om koden i en metod är lång kan det bli svårt att få en överblick över kod i metoden. Lösning: Dela upp koden i lämpliga metoder och anropa metoderna istället. 56
Kodkvalité Synlighet - Endast de metoder och variabler som andra klasser ska kunna använda ska vara publika - De variabler som klassen själv ska kontrollera ska vara privata Andra klasser kan ändra/hämta värden med hjälp av setter/getter (inkapsling) 57
Objektorienterad analys 58
Objektorienterad analys(ooa) - Analysera problemet - Vad ska programmet göra? Skapa användningsfall - Bestäm vilka klasser som ska användas och hur de ska samarbeta 59
Objektorienterad design(ood) - Förfina och detaljera analysen - Bestäm vilka metoder och variabler som ska ingå i klasserna 60
Objektorienterad Programmering(OOP) - Implementera designen i något objektorienterat språk (Java, C++, C#,...) 61
OOA/OOD Översikt på arbetsgången - Ta fram objektkandidater - Grovrensa bland objekten - Klassifiera objekten - Gruppera och beskriv relationer mellan klasserna - Ta fram användningsfall och validera systemet - Rita klassdiagram - Detaljdesigna klasser 62
OOA/OOD Ta fram objektkandidater - Brainstorming - Substantiv-verb metoden: Substantiv: Möjliga objektet Verb: Möjliga metoder Checklista: - Faktiska saker (bil, hus) - Platser(rum, trädgård) - Begrepp(bankkonto, transaktion) - Roller(kund, spelare) - Händelser(landning, avbrott) -... 63
OOA/OOD Grovrensa bland objekten - Finns det dubbletter? Är några objekt samma, men har olika namn? - Är några orimliga och borde vara variabler? Ex. Bör namnet på en person vara en klass eller en instansvariabel? 64
OOA/OOD Klassificera objekten - Arbeta till exempel CRC-kort C- class klassens namn R- responsibility --- Vad vet objekten av en klass eller vad gör objekten för att fylla sin funktion? Ex. Ett objekt av klassen Person vet namnet på personen C- collaborators, --- Vilka klasser samarbetar klassen med? CRC-korten kan flyttas runt, uppdateras och slängas i efterhand 65
OOA/OOD Gruppera och beskriv relationer mellan klasser - Vilka klasser hör ihop? Lämpligt med arv/gränssnitt? Placera I paket? 66
OOA/OOD Användningsfall och validering - Användningsfall Vad ska programmet utföra? - Validering Kan klasserna användas för att utföra användningsfallen Har vi rätt klasser? Har vi hittat alla klasser som behövs? Vilka klasser samarbetar och hur? 67
OOA/OOD Rita klassdiagram - Baserat på analysen 68
OOA/OOD Detaljdesigna klasser - Vilka metoder behöver vi? Framförallt icke-privata metoder klassens gränssnitt - Vilka variabler behövs? Vilka datastrukturer är lämpliga att använda? 69
Laboration 4 - Textbaserat äventyrsspel - Skriv egen kod från grunden Strukturera upp koden i lämpliga klasser Använd lämpliga datastrukturer - Läs igenom instruktionen och kraven ordentligt innan ni sätter i gång! 70
Kommande veckor Laboration 3: deadline: 13/10 Laboration 4: deadline: 29/10 Laborationstillfällen: 13/10 och 20/10 Nästa föreläsning: 3/11 - Repetition - Exempeltenta - Maila in önskemål Det mesta schemalagda är slut Mycket eget arbete - Maila om ni behöver hjälp/undrar något! Anmäl er till tentan i Studentportalen 71
Arbeta själv - Arbeta med laborationerna - Gör programmeringsövningar Från boken Laborationer fårn tidigare kursomgångar - Läs till tentamen - Arbeta med gamla tentor 72