Programmering för språkteknologer II, HT2011 evelina.andersson@lingfil.uu.se Rum 9-2035 http://stp.ling.uu.se/~evelina/uv/uv11/pst2/
Idag - Hashtabeller - Flerdimensionella arrayer (2D) 2
Repetition - Vad matchar ((abc de))* Svar:, abc, de, abcabc, dede, abcde, deabc,... a a b S 1 S 2 S 3 4 c S d S 5 e d 3
Dagens automat S 1 a S 2 b S 3 c S 4 d S 5 4
Dagens automat I filen initial s1 final s3 s5 s1 a s2 s2 b s3 s1 c s4 s4 d s5 5
Laborationen -kodöversikt Automata #initialstate: String #finalstates: String[] +accepts(indata String): boolean Förklaring # protected + public - private - klassvariabel FiniteStateAutomata - transitions: Hashmap<String, String> - keystring(state String, symbol String):String ArrayAutomata - transitions: char[][] - EMPTY : char 6
Dagens automat skapad med konstrukturerna Dagens automat skapad med FiniteStateAutomata(String filename): initialstate = s1 finalstates = { s3, s5 transitions i hashtabell Dagens automat skapad med ArrayAutomata(String filename): initialstate = s1 finalstates = { s3, s5 transitions i 2D-array 7
Hashtabeller 8
Associativa typer - En array associerar heltal med värden av godtycklig typ: String[] array = new String[4]; array[0] = "s2"; array[1] = "s3"; array[2] = "s4"; array[3] = "s5"; s2 s3 s4 s5 index: 0 1 2 3 9
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 nyckel: s1->a s2->b s1->c s4->d 10
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 nyckel: s1->a s2->b s1->c s4->d Problem: Hur ska datorn veta var i arrayen s1->a finns? 11
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 nyckel: s1->a s2->b s1->c s4->d Problem: Hur ska datorn veta var i arrayen s1->a finns? Lösning: Konvertera s1->a till ett giltigt index med hjälp av en hashfunktion. 12
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: s1->a s2->b s1->c s4->d Lösning: Konvertera s1->a till ett giltigt index med hjälp av en hashfunktion. 13
Hashtabeller Skapa hashtabell 0 1 2 3 4 5 6 7 HashMap<String,String> transitions = new HashMap<String,String>(100); 14
Hashtabeller insättning s1->a s2->b s1->c s4->d 0 1 2 s1-> a s2 3 4 5 6 7 Sätt in övergången s1 a s2 i automaten. transitions.put(keystring("s1", "a"), "s2"); 15
Hashtabeller insättning s1->a s2->b s1->c s4->d 0 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 Sätt in övergången s2 b s3 i automaten. transitions.put(keystring("s2", "b"), "s3"); 16
Hashtabeller insättning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 Sätt in övergången s1 c s4 i automaten. transitions.put(keystring("s1", "c"), "s4"); 17
Hashtabeller insättning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Sätt in övergången s4 d s5 i automaten. transitions.put(keystring("s4", "d"), "s5"); 18
Hashtabeller insättning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Nu har vi lagrat vår automat i hashtabellen. 19
Hashtabeller Sökning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Om automaten befinner sig i tillstånd s1 och läser a på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s1", "a")); 20
Hashtabeller Sökning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Om automaten befinner sig i tillstånd s2 och läser b på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s2", "b")); 21
Hashtabeller Sökning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Om automaten befinner sig i tillstånd s1 och läser c på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s1", "c")); 22
Hashtabeller Sökning s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 s2->b s3 6 7 s4->d s5 Om automaten befinner sig i tillstånd s4 och läser d på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s4", "d")); 23
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 24
Hashtabeller Krockhantering Vad händer om två nycklar får samma index i hashtabellen? 25
Hashtabeller Krockhantering s1->a s2->b s1->c s4->d 0 1 2 s1-> a s2 3 4 5 6 7 transitions.put(keystring("s1", "a"), "s2"); 26
Hashtabeller Krockhantering s1->a s2->b s1->c s4->d 0 1 2 s1-> a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s2", "b"), "s3"); 27
Hashtabeller Krockhantering s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s1", "c"), "s4"); 28
Hashtabeller Krockhantering s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "d"), "s5"); 29
Hashtabeller Krockhantering s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "d"), "s5"); Index 2 i hashtabellen har redan ett värde, så nu blir det en krock. Hur ska vi lösa detta? 30
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 31
Hashtabeller Krockhantering länkning - Varje plats i hashtabellen innehåller en länkad lista s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1-> a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "d"), "s5"); 32
Hashtabeller Krockhantering länkning - Varje plats i hashtabellen innehåller en länkad lista 0 s1->c s4 s1->a s2->b s1->c s4->d 1 2 s1->a s2 3 4 5 S2->b s3 s4->d s5 6 7 transitions.put(keystring("s4", "d"), "s5"); 33
Hashtabeller Krockhantering Länkning: Sökning 0 s1->c s4 s1->a s2->b s1->c s4->d 1 2 s1->a s2 3 4 5 S2->b s3 s4->d s5 6 7 Om automaten befinner sig i tillstånd s4 och läser d på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s4", "d")); 34
Hashtabeller Krockhantering Länkning: Sökning 0 s1->c s4 s1->a s2->b s1->c s4->d 1 2 s1->a s2 3 4 5 S2->b s3 s4->d s5 6 7 Om automaten befinner sig i tillstånd s4 och läser d på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s4", "d")); 35
Hashtabeller Krockhantering Länkning: Sökning 0 s1->c s4 s1->a s2->b s1->c s4->d 1 2 s1->a s2 3 4 5 S2->b s3 s4->d s5 6 7 Om automaten befinner sig i tillstånd s4 och läser d på indata. I vilket tillstånd hamnar automaten i då? String state = (String)transitions.get(keyString("s4", "d")); 36
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. 37
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1->a s2 3 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "d"), "s5"); 38
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. s1->a s2->b s1->c s4->d 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "d"), "s5"); 39
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "e"), "s6"); 40
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 5 S2->b s3 6 7 transitions.put(keystring("s4", "e"), "s6"); 41
Hashtabeller Krockhantering Öppen adressering: Lagra på den första lediga platsen. s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 s4->e s6 5 S2->b s3 6 7 transitions.put(keystring("s4", "e"), "s6"); 42
Hashtabeller Krockhantering Öppen adressering: Sökning s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 s4->e s6 5 S2->b s3 6 7 transitions.get(keystring("s4", "e")); 43
Hashtabeller Krockhantering Öppen adressering: Sökning s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 s4->e s6 5 S2->b s3 6 7 transitions.get(keystring("s4", "e")); 44
Hashtabeller Krockhantering Öppen adressering: Sökning s1->a s2->b s1->c s4->d s4->e 0 s1->c s4 1 2 s1->a s2 3 s4->d s5 4 s4->e s6 5 S2->b s3 6 7 transitions.get(keystring("s4", "e")); 45
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. 46
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 47
Hashtabeller - JAVA Klasser: Hashtable, HashMap, HashSet Konstruktorer: - Hashtable(); HashMap(); HashSet(); Kapacitet: 16 Täthet: 0.75 - Hashtable(int capacity); HashMap(int capacity); HashSet(int capacity); Kapacitet: capacity Täthet: 0.75 - Hashtable(int capacity, float loadfactor); HashMap(int capacity, float loadfactor); HashSet(int capacity, float loadfactor); Kapacitet: capacity Täthet: loadfactor 48
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. 49
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 50
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 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 52
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. 53
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; 54
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"); 55
Flerdimensionella arrayer 56
Endimensionell array - Repetition - En array deklareras så här: int[] array = new int[4]; cell array: 0 0 0 0 index: 0 1 2 3 57
Endimensionell array - Repetition - Data i en array lagras så här: array[0] = 0; array: 0 0 0 0 index: 0 1 2 3 58
Endimensionell array - Repetition - Data i en array lagras så här: array[0] = 0; array[1] = 1; array: 0 1 0 0 index: 0 1 2 3 59
Endimensionell array - Repetition - Data i en array lagras så här: array[0] = 0; array[1] = 1; array[2] = 2; array: 0 1 2 0 index: 0 1 2 3 60
Endimensionell array - Repetition - Data i en array hämtas så här: int v = array[0] // v = 0; array: 0 1 2 0 index: 0 1 2 3 61
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; array: 0 1 2 0 insertat(array, 5, 1); 0 5 1 2 index: 0 1 2 3 62
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 2 0 pos: 1 63
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 2 0 pos: 1 i = 3 64
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 2 0 pos: 1 i = 3 swap: 2 65
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 0 0 pos: 1 i = 3 swap: 2 66
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 0 2 pos: 1 i = 3 swap: 2 67
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; Swap: Teknik för att byta plats på två array[pos] = data; värden i en array. data: 5 array: 0 1 0 2 pos: 1 i = 3 swap: 2 68
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 0 2 pos: 1 i = 2 69
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 1 0 2 pos: 1 i = 2 swap: 1 70
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 0 0 2 pos: 1 i = 2 swap: 1 71
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 0 1 2 pos: 1 i = 2 swap: 1 72
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 0 1 2 pos: 1 i = 1 73
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; data: 5 array: 0 5 1 2 pos: 1 74
Endimensionell array - Repetition void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; array: 0 5 1 2 75
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 5 2 1 removeat(array,1); array: 0 2 1 0 76
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 5 2 1 pos: 1 77
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 5 2 1 pos: 1 i = 1 78
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 2 1 pos: 1 i = 1 array.length 1 = 3 79
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 2 1 pos: 1 i = 2 array.length 1 = 3 80
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 1 1 pos: 1 i = 2 array.length 1 = 3 81
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 1 1 pos: 1 i = 3 array.length 1 = 3 82
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 1 0 pos: 1 array.length 1 = 3 83
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; array: 0 2 1 0 84
Endimensionell array - Repetition int[] copyarray(int[] array) { int copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 copyarray(array); copy: 0 2 1 0 85
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 86
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 copy: 0 0 0 0 87
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 0 0 0 88
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 0 0 0 89
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 0 0 0 90
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 2 0 0 91
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 2 0 0 92
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 2 1 0 93
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 2 1 0 94
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i array.length = 4 copy: 0 2 1 0 95
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; array: 0 2 1 0 i = 4 array.length = 4 copy: 0 2 1 0 96
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; copy: 0 2 1 0 97
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 98
Dagens automat S 1 a S 2 b S 3 c S 4 d S 5 Nu ska vi lagra den i vår 2D-array transitions. 99
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[1][2] = a; // sätt in s1 a s2 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 100
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[1][2] = a; // sätt in s1 a s2 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 101
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[1][2] = a; // sätt in s1 a s2 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a 102
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[1][4] = c; // sätt in s1 c s4 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a 103
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[1][4] = c; // sätt in s1 c s4 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a c 104
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[2][3] = b; // sätt in s2 b s3 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a c 105
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[2][3] = b; // sätt in s2 b s3 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c 106
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[4][5] = d; // sätt in s4 d s5 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c 107
Java Flerdimensionella arrayer Exempel: char[][] transitions = new char[5][6]; transitions[4][5] = d; // sätt in s4 d s5 index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 108
Java Flerdimensionella arrayer Nu finns automaten i transitions. index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 109
Java Flerdimensionella arrayer Hämta data från cell[1][2]: char symbol = transitions[1][2]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 110
Java Flerdimensionella arrayer Hämta data från cell[1][2]: char symbol = transitions[1][2]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 111
Java Flerdimensionella arrayer Hämta data från cell[1][2]: char symbol = transitions[1][2]; // symbol = a index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 112
Java Flerdimensionella arrayer Hämta data från cell[1][4]: char symbol = transitions[1][4]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 113
Java Flerdimensionella arrayer Hämta data från cell[1][4]: char symbol = transitions[1][4]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 114
Java Flerdimensionella arrayer Hämta data från cell[1][4]: char symbol = transitions[1][4]; // symbol = c index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 115
Java Flerdimensionella arrayer Hämta data från cell[2][3]: char symbol = transitions[2][3]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 116
Java Flerdimensionella arrayer Hämta data från cell[2][3]: char symbol = transitions[2][3]; // symbol = b index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 117
Java Flerdimensionella arrayer Hämta data från cell[4][5]: char symbol = transitions[4][5]; index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 118
Java Flerdimensionella arrayer Hämta data från cell[4][5]: char symbol = transitions[4][5]; // symbol = d index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 119
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 120
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 121
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 122
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 123
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 124
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 125
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 126
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 127
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 128
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 129
Java Flerdimensionella arrayer Loopa igen en 2D-array: for(int i = 0; i < transitions.length;i++) for(int j = 0; j < transitions[i].length;j++) System.out.println(transitions[i][j]); index: 0 1 2 3 4 5 index: char[][] transitions: 0 1 2 3 4 a b c d 130
Endimensionell array - Repetition int[] copyarray(int[] array) { int[] copy = new int[array.length]; for(int i = 0; i < array.length; i++) { copy[i] = array[i]; return copy; 131
Tvådimensionell array - CopyArray int[][] copyarray(int[][] array) { int[][] copy = new int[array.length][array[0].length]; for(int i = 0; i < array.length;i++) for(int j = 0; j < array[i].length;j++) copy[i][j] = array[i][j]; return copy; 132
Tvådimensionell array - CopyArray int[][] copyarray(int[][] array) { int[][] copy = new int[array.length][array[0].length]; for(int i = 0; i < array.length;i++) for(int j = 0; j < array[i].length;j++) copy[i][j] = array[i][j]; return copy; index: 0 1 2 3 index: 0 1 2 3 0 1 2 0 1 2 4 5 133
Tvådimensionell array - CopyArray int[][] copyarray(int[][] array) { int[][] copy = new int[array.length][array[0].length]; for(int i = 0; i < array.length;i++) for(int j = 0; j < array[i].length;j++) copy[i][j] = array[i][j]; return copy; index: 0 1 2 3 index: 0 1 2 3 0 1 2 4 0 1 2 4 5 134
Endimensionell array - Repetition void removeat(int[] array, int pos) { for(int i = pos; i < array.length - 1; i++) { array[i] = array[i + 1]; array[array.length-1] = 0; 135
Tvådimensionell array - removeat void removeat(int[][] array, int pos1, int pos2) { for(int i = pos2; i < array[pos1].length - 1; i++) { array[pos1][i] = array[pos1][i + 1]; array[pos1][array[pos1].length-1] = 0; index: 0 1 2 3 4 5 pos1: index: 0 1 2 a b c 136
Endimensionell array - insertat void insertat(int[] array, int data, int pos) { for(int i = array.length - 1; i > pos; i--) { int swap = array[i - 1]; array[i - 1] = array[i]; array[i] = swap; array[pos] = data; 137
Tvådimensionell array - insertat void insertat(int[][] array, int data, int pos1, int pos2) { for(int i = array[pos1].length - 1; i > pos2; i--) { int swap = array[pos1][i - 1]; array[pos1][i - 1] = array[pos1][i]; array[pos1][i] = swap; array[pos1][pos2] = data; index: 0 1 2 3 4 5 pos1: index: 0 1 2 a b c 138
Nästa gång - Flerdimensionella arrayer (3D) - Sökalgoritmer - Sökträd 139