Samlingar av objekt + Generics (parametrisk polymorfism)

Relevanta dokument
Sammansatta datatyper Generics: Parametrisk polymorfism

Sammansatta datatyper Generics: Parametrisk polymorfism

Sammansatta datatyper Generics: Parametrisk polymorfism

Föreläsning 2. Länkad lista och iterator

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4 Innehåll

Föreläsning 2. Länkad lista och iterator

DAT043 - föreläsning 8

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Länkade strukturer. (del 2)

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Föreläsning 2 Innehåll

TDDD78 Viktiga begrepp, del 2

Arrayer. results

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

Föreläsning 2 Innehåll. Generiska klasser. Generik i Java. Varför generiska klasser Bakgrund

Repetition av OOP- och Javabegrepp

Stackar, köer, iteratorer och paket

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Repetition av OOP- och Javabegrepp

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Samlingar Collection classes

Den som bara har en hammare tror att alla problem är spikar

Tommy Färnqvist, IDA, Linköpings universitet

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Generisk klass med typparameter Inre klass - ListIterator

Föreläsning 2 Innehåll

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Java Collections Framework. Föreläsning 2 Innehåll. Java Collections Framework interface hierarki. Java Collections Framework interface hierarki

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Föreläsning 3. Stack

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Länkade strukturer, parametriserade typer och undantag

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 5 Erik Nilsson, Institutionen för Datavetenskap, LiU

Typhierarkier del 1 Gränssnitt, ärvning mellan gränssnitt, ärvning mellan klasser

TDDD78, TDDE30, 729A Typhierarkier del 2 Vad krävs? Hur fungerar det?

Föreläsning 10. ADT:er och datastrukturer

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

TDDD78 Objektorientering i Java, del 2

Föreläsning 2 Datastrukturer (DAT037)

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Laboration A Objektsamlingar

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Samlingar Collection classes

Objektorienterad Programkonstruktion. Föreläsning 9 30 nov 2016

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

OOP Objekt-orienterad programmering

Classes och Interfaces, Objects och References, Initialization

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Saker du ska kunna Föreläsning 13 & 14

Föreläsning 2 Datastrukturer (DAT037)

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Föreläsning REPETITION & EXTENTA

DAT043 Objektorienterad Programmering

Föreläsning 3. Stack

Del A (obligatorisk för alla)

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Subtyping och variance. Objekt-orienterad programmering och design Alex Gerdes, 2018

Collection classes. Interface, första exempel. Interface (forts) Men först

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Collection Classes. bjectorienterad programmering Sida 1

Objektorienterad Programmering (TDDC77)

Objektorienterad programmering med Java, Generics

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

Lösningsförslag till tentamen i OOP, HI1027 Fredag 21 oktober 2011

Programmering för språkteknologer II, HT2014. Rum

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Föreläsning 12. Länkade listor

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Föreläsning 8: Exempel och problemlösning

Arrayer (fält)

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Transkript:

jonas.kvarnstrom@liu.se 2015 Samlingar av objekt + Generics (parametrisk polymorfism)

Listor och arrayer 2 Enligt TDDD73: Listan är en mycket användbar sammansatt datatyp. I många andra språk kallar man listor för arrayer. Men många språk har både listor och arrayer! Exakta definitioner varierar Listor (i Java): Implementerade som klasser Finns många varianter (olika lagring) Kan växa och krympa Arrayer (i Java): "Inbyggda" i språket En enda variant Fixerad storlek

Arrayer 1: Arraytyper 4 För varje typ T kan Java dynamiskt skapa en associerad arraytyp T[] Exempel: [], String[], Circle[] Subklass till Arrayer är objekt, med metoder och fält och element [] String[] Circle[] Circle[][]

Arrayer 2: Användning 5 Circle[] circles = new Circle[10]; int[] numbers = new int[rnd()]; Arrayer skapas med new Storlekar är fasta, men sätts vid körning int second = numbers[1]; Element hämtas ut med index (första = 0) for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); Index: 0 length-1 Arrayer känner till sin egen längd int val = numbers[42000]; Indexkontroll: Ger ArrayIndexOutOfBoundsException numbers length 42 [0] 0 [1] 0 [41] 0 Element initialiseras: 0, 0.0, null, eller false

Arrayer 3: Pekar-arrayer Objektarrayer innehåller pekare: Circle[ ] circles = new Circle[10]; circles 6 length [0] [1] [9] 10 Element initialiseras till null Inga nya Circle-objekt skapas! Kan peka på vilken Circle som helst, inklusive subklasser (GraphicCircle)

Arrayer 4: Ange element Att initialisera en array public static void main(string[ ] args) { int[ ] numbers = new int[ ] { 1, 2, 4, 8, 16 ; print(numbers); print(new int[ ] { 44, getrandomint() ); Antal element: Implicit 7 Kompileras till kod! Motsvarar: int[ ] temp = new int[2]; temp[0] = 44; temp[1] = getrandomint(); print(temp); Kompileras till kod! Motsvarar: int[ ] numbers = new int[5]; numbers[0] = 1; numbers[1] = 2; numbers[2] = 4; numbers[3] = 8; numbers[4] = 16;

Arrayer 5: Flerdimensionella arrayer 8 Arrayer av arrayer: Square[ ][ ] board Square[ ] row Square pos = new Square[20][10]; = board[19]; = board[1][0]; length [0] [9] 10 board row length [0] [1] [18] [19] 20 length [0] [9] 10 length [0] [9] 10

Arrayer 6: Tillgängliga metoder Arrayer ärver metoder från Av historiska anledningar: Bara default-implementationerna 9 Default-implementationer equals() testar identitet int[ ] ar1 = new int[3]; // 0, 0, 0 int[ ] ar2 = new int[3]; // 0, 0, 0 System.out.println(ar1.equals(ar2)); // false Kan inte ändras: Bakåtkompatibilitet! Vad vi oftast vill Hjälpmetoder i java.util.arrays int[ ] ar1 = new int[3]; // 0, 0, 0 int[ ] ar2 = new int[3]; // 0, 0, 0 System.out.println(Arrays.equals(ar1,ar2)); // true Också i java.util.arrays: sort(), binarysearch(), copyofrange(), deeptostring(), hashcode(), fill(),

Arrayer 7: Styrkor och svagheter Styrka: Effektiv användning av minne Liten konstant "startkostnad", 12 20 bytes Plus elementens "verkliga" kostnad Styrka: Snabbt Element 40: Minnesadress = [arraystart+12] + 40 * 4 numbers 10 length 42 [0] 0 [1] 0 [41] 0 Svaghet: Kan inte ändra längd när den har skapats! Saknar metoder som add(), append(), remove(),

Listor 1: Intro Listor: Variabel storlek bekvämt att använda! Inget stöd i språket, men i klassbiblioteken 12 För att förstå listor bättre: Vi visar en möjlig implementation Använder en array internt Måste byta ut arrayen när element läggs till

Listor 2: En listklass 13 public class StringList { private String[] elements; private int size; Använder en array för lagring! public MyList() { this.elements = new String[8]; this.size = 0; Allokerar fler platser än nödvändigt Hur många av platserna är använda? StringList strings = new StringList(); strings elements size 0 length [0] [1] [7] 8

Listor 3: En listklass (forts.) 14 public void add(string element) { elements[size] = element; size++; StringList strings = new StringList(); strings.add("hello"); strings elements size 1 length [0] [1] [7] 8 "Hello" Vad händer när arrayen blir full?

Listor 4: En listklass (forts.) 15 public void add(string element) { if (size == elements.length) { int newsize = 2*size; String[] arr2 = new String[newsize]; System.arraycopy( ); this.elements = arr2; elements[size] = element; size++; Är interna lagringen full? Skapa större array, kopiera innehållet, kasta bort gamla arrayen!

Listor 5: En listklass (forts.) 16 public String get(int index) { if (index < 0 index >= size) { throw new IndexOutOfBoundsException(); else { return elements[index]; Kolla index: Tillåt inte get(4) när size==2!

Listor 6: Stoppa in element Effektiv representation för de flesta operationer public void add(int index, E element) { if (size == elements.length) { allocate more memory 17 System.arraycopy(elements, index, elements, index + 1, size - index); elements[index] = element; size++; A B C D E F G H list.add(2, "X"); A B C C D E A B X C D E F G H F G H Kopiera tar tid! Stoppa in

Elementtyper 1: Typspecifika listor? Vår listklass lagrar bara strängar! public class StringList { private String[] elements; private int size; 19 Behöver vi en listklass för varje elementtyp?

Elementtyper 2: Godtyckliga objekt 20 public class List { private [] elements; private int size; Array av -pekare, kan peka på objekt av godtycklig klass public List() { this.elements = new [8]; this.size = 0; public get(int index) { if (index >= 0 && index <size) { return elements[index]; else /* Signal error */ public void add( element) { if (size == elements.length) { /* Create a new array; copy old element */ elements[size] = element; size++;

Elementtyper 3: Problem Nu får vi nya problem! 21 1: Ingen typsäkerhet när vi adderar element! Vill ha en lista där vi stoppar in strängar: List greetings = new List(); Kan lägga in strängar: greetings.add("hello"); Kan råka lägga in cirklar också inget fel vid kompilering eller körning! greetings.add(new Circle(1, 1, 3)); public class List { public List() { public get(int index) { public void add( element) {

Elementtyper 4: Problem 22 Problem 2: Ingen typinformation när vi hämtar element! List greetings = new List(); greetings.add("hello"); greetings.add(new Circle(1, 1, 3)); String str = greetings.get(0); String str = (String) greetings.get(0); // Kompileringsfel // OK Vi måste tala om för kompilatorn: "Jag vet att jag la en sträng på position 0 jag lovar!" Krävs en cast extra arbete för oss public class List { public List() { public get(int index) { public void add( element) {

Elementtyper 5: Problem 23 Problem 3: Tänk om vi har fel! List greetings = new List(); greetings.add("hello"); greetings.add(new Circle(1, 1, 3)); for (int i = 0; i < greetings.size(); i++) { String str = (String) greetings.get(i); // Runtime error for i=1 it s a Circle! Upptäcks inte när programmet kompileras

Vanliga parametrar till metoder 25 void printmult3() { for (int i = 1; i <= 13; i++) { System.out.println(3 * i); void printmult5() { for (int i = 1; i <= 13; i++) { System.out.println(5 * i); void printmult(int num) { for (int i = 1; i <= 13; i++) { System.out.println(num * i); num är en heltalsvariabel Kan ha värdet 3, 4, 5, 8, void printmult4() { for (int i = 1; i <= 13; i++) { System.out.println(4 * i); void printmult8() { for (int i = 1; i <= 13; i++) { System.out.println(8 * i);

Typparametrar till klasser 26 class ListOfString { String[] elements; int length; String get(int index) { void add(string element) { class ListOfShape { Shape[] elements; int length; Shape get(int index) { void add(shape element) { class List<E> { E[] elements; int length; E get(int index) { void add(e element) { E är en typvariabel Kan ha värdet String, Shape, class ListOfCircle { Circle[] elements; int length; Circle get(int index) { void add(circle element) { class ListOfButton { Button[] elements; int length; Button get(int index) { void add(button element) {

Generics 1: Intro Generiska typer med typparametrar class MyList<E> { En array där elementen har typ E E[] elements; verkliga typen är inte angiven än int length; E get(int index) { return elements[index]; void add(e element) { // Takes a parameter of type E 27 Kan "instansieras" med olika typer som parameter MyList<String> nästan exakt som: class MyList<String> { String[] elements; int length; String get(int index) { void add(string element) { MyList<Shape> nästan exakt som: class MyList<Shape> { Shape[] elements; int length; Shape get(int index) { void add(shape element) {

Generics 2: Användningsexempel 28 class MyList<E> { E[] elements; int length; E get(int index) { return elements[index]; void add(e element) { En lista där E=String: MyList<String> greetings = new MyList<String>(); greetings.add("hello"); // OK greetings.add(new Circle(1, 1, 3)); // Compile-time error: add(string) String str = greetings.get(0); // No cast needed: String get(int index) En lista där E=MyList<String> en lista av listor! MyList<MyList<String>> lists = new MyList<MyList<String>>(); lists.add(greetings);

Generics 3: Att skriva mindre 29 class MyList<E> { E[] elements; int length; E get(int index) { return elements[index]; void add(e element) { Mycket repetition: MyList<MyList<String>> listor = new MyList<MyList<String>>(); Syntaktiskt socker: Diamant-operatorn (betyder "samma som förut") MyList<MyList<String>> listor = new MyList<>(); DRY-principen: Don t RepeatYourself! Regelbrott är WET: Write Everything Twice

Generics 4: "Råa" typer 30 class MyList<E> { E[] elements; int length; E get(int index) { return elements[index]; void add(e element) { Man kan använda en generisk typ utan att ange typparametrar: MyList listor = new MyList(); // Defaults to "List of " Enbart för kompatibilitet med gammal kod! Generics kom i Java 1.5 (2004) Gammal kod borde fortfarande gå genom kompilatorn, men med varningar Gör inte detta i ny kod!

Parametrisk polymorfism 31 Kallas generisk programmering, ger oss parametrisk polymorfism Samma namn (MyList) Olika beteende (beroende på typparameter) Jämför med subtypspolymorfism Samma metodnamn, flera implementationer inom en typhierarki Olika implementation väljs dynamiskt, beroende på verklig objekttyp Jämför med ad-hoc-polymorfism (overloading) Samma metodnamn, flera implementationer i samma klass Olika implementation väljs statiskt, beroende på statiska parametertyper

Typparametrar och objekttyper 33 En typparameter måste ange en objekttyp! class List<E> { E[] elements; int length; E get(int index) { void add(e element) { List<String> strings; // OK List<Button> buttons; // OK List<int> numbers; // Does not work! för egentligen skapas bara en klass! class List { [] elements; int length; get(int index) { void add( element) { Kompilatorn tar hand om resten Sparar minne, men int är inget!

Wrappers 1: Intro Hur skapar vi en listklass som accepterar heltal? 34 Implementera om strukturerna? class IntArrayList { private int[] elements; private int length; public int get(int index) { return elements[index]; void add(int element) { Repetera för 8 primitiva typer och för varje datastruktur Kan göras finns färdiga bibliotek på nätet (GNU Trove, ) Använd wrappers! public class Integer { private final int value; public Integer(int value) { this.value = value; public int intvalue() { return value; Repetera för 8 primitiva typer klart

Wrappers 2: Wrapper-objekt Det finns en wrapper-klass för varje primitiv datatyp 35

Wrappers 3: Skapa För att skapa wrapper-objekt: Kan använda vanlig konstruktor Number ten = new Integer(10); Number pi = new Double(3.14); Bättre: Använd statiska fabriksmetoden valueof() Number ten = Integer.valueOf(10); Number pi = Double.valueOf(3.14); 36 Sparar tid och minne: Återanvänder objekt för vanliga värden! public class Integer { public static Integer valueof(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); Fungerar för att wrappers är immutable: Värden kan inte ändras

Wrappers 4: Användning Resulterar i objekt kan lagras i listor, objektpekare, List<Number> numbers = new ArrayList<>(); numbers.add(integer.valueof(10)); numbers.add(double.valueof(3.14)); 37 För att hämta ut värdet: Anropa typevalue() Number intobj int val0 double val1 = numbers.get(0); = intobj.intvalue(); = numbers.get(1).doublevalue();

Wrappers 5: Användning Kan använda automatisk boxing och unboxing ("Paketinslagning") 38 List<Number> numbers = new ArrayList<>(); numbers.add(10); numbers.add(3.14); double val1 = numbers.get(1); VARNING: Osynlig ineffektivitet! Kan skapa nya objekt Tar (lite) extra tid att plocka ut värden ur objekt Vissa rekommenderar explicit boxing / unboxing istället

Wrappers 6: Använder mer minne 39 int[] numbers = new int[] { 12, 14,16, 18, 20 List<Integer> list = new ArrayList<>(); list.add(12); list.add(14); list.add(16); list.add(18); list.add(20); Array ArrayList length 5 [0] 12 [1] 14 [4] 20 Mindre andel overhead för mer komplexa strukturer size arr length [0] [1] [4] 5 5 value value value 12 14 20

Java Collections Framework jonas.kvarnstrom@liu.se 2015

Collections Framework 1: Intro 41 Collections Framework: Många sammansatta datastrukturer 1) Uppsättning gränssnitt för listor, köer, mängder, mappningar Kom ihåg: Gränssnitt ger oss frihet att välja implementation!

Collections Framework 2: Intro 42 2) En uppsättning implementationer

Collections Framework 3: Intro 43 3) Några hjälpklasser

Collection 1: Intro Collection<E>: Generell samling av objekt Vissa samlingar är ordnade Listor har ett första element inte mängder Vissa tillåter dubblerade element Listor kan innehålla två identiska element inte mängder 45

Collection 2: Grundläggande funktionalitet 46 Lägga till element: c.add(e) c.addall(collection) Testa innehåll: c.isempty(), c.size() c.contains( obj) c1.equals(collection c2) innehåller samma element, i ngn ordning? c1.containsall(collection c2) alla element i c2 finns i c1? Hämta alla element: c.toarray() En [ ] som innehåller samma element Ta bort element: c.clear() c.remove() tar bort alla element

List 1: Intro List<E> extends Collection<E> 47 Alltid ordnad: Element har index Implementeras av ArrayList Mycket vanlig, implementation liknar våra tidigare exempel LinkedList Stack, Vector Ganska vanlig, andra egenskaper Använd inte, deprecated

Länkade listor (1) Principen bakom länkade listor: LinkedList 48 size first 5 En extra listnod per element använder mer minne next prev value ListNode next prev value ListNode next prev value ListNode value 12 value 14 value 16

Länkade listor (2) Snabbt att skjuta in / ta bort värden size first LinkedList 5 next prev value value ListNode 15 49 next prev value ListNode next prev value ListNode next prev value ListNode value 12 value 14 value 16

Länkade listor (3) 50 Tar lång tid att ta fram värde nummer n i listan size first next prev value LinkedList 5 ListNode ListNode<E> get(int index) { ListNode<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; next prev value ListNode next prev value ListNode value 12 value 14 value 16

List 2: Metoder 51 Hämta / hitta element list.get(index) list.indexof( needle), list.lastindexof( needle) Collections can hitta dellistor, göra binärsökning, hitta min/max-element Lägga till och ta bort list.add(e value) ärvs från Collection! list.add(int index, E value) flyttar element efter givet index list.addall(int index, Collection c) list.remove(int index) Ändra element list.set(int index, E value) Collections kan söka/ersätta, fylla med ett värde, kopiera listor Omarrangera listor Collections kan blanda, sortera, rotera, reversera listor

List 3: Listor vs. arrayer 52 Arrayer används: För att implementera datatyper ArrayList måste använda en primitiv array När varje nanosekund spelar roll Bara efter CPU-profilering som visar att listhantering spelar roll Listor används: Nästan alltid! Många hjälpfunktioner tillgängliga Kan lätt lägga till och ta bort element, osv Används av många klasser i Javas klassbibliotek När varje byte spelar roll Bara efter minnesprofilering Ibland om storleken är fixerad Om storleken varierar: Låt listorna hantera detta! Tetrislabben använder arrayer eftersom Board-storleken är fixerad!

Queue 1: Köer Queue<E> extends Collection<E> Kan lägga till i slutet av kön Kan ta bort i början av kön 53 Implementeras av ArrayDeque, LinkedList grundläggande köstrukturer Varianter Deque: Även "på andra sidan" (Double-Ended QUEue) PriorityQueue har element i sorterad ordning Vad händer om det är omöjligt? Operation Kastar exception Returnerar speciellt värde Stoppa in element add(e) offer(e) Ta bort element remove() poll() Se på första elementet element() peek()

Map (1) Map är Javas motsvarighet till dictionaries Vanlig klass, inte språkfiness mer att skriva 54 >>> dict = {'a': 45, 'b': 39, 'c': 19 >>> dict['a'] 45 >>> dict['d'] = 4711 >>> dict {'a': 45, 'c': 19, 'b': 39, 'd': 4711 >>> len(dict) 4 public static void main(string[] args) { Map<Character,Integer> dict = new HashMap<>(); dict.put('a', 45); dict.put('b', 39); dict.put('c', 19); System.out.println(dict.get('a')); dict.put('d', 4711); System.out.println(dict); System.out.println(dict.size()); 45 {a=45, b=39, c=19, d=4711 4

Map En Map<K,V> associerar nycklar/keys K med värdenv final Map<String,String> phone = new TreeMap<String,String>(); phone.put("jane Doe", "555-1234"); phone.put("john Doe", "555-4321"); System.out.println(phone.get("John Doe")); 555-4321 55 Några map-klasser: TreeMap sorterar elementen, kräver Comparable/Comparator HashMap Operationer: map.put(k key, V value), map.get( key) map.remove( key), map.clear() kräver hashkoder, förklaras i TDDD86 map.entryset() map.keyset() map.values() ett Set som innehåller <key, value>-par ett Set som innehåller alla nycklar en Collection som innehåller alla värden

Iteration 1: Med index Hur kan man iterera över alla element i en samling? Med en array eller ArrayList fungerar index utmärkt: 57 static boolean contains(list<?> haystack, needle) { for (int i = 0; i < haystack.size(); i++) { if (haystack.get(i).equals(needle)) return true; return false;

Iteration 2: Med index Hur kan man iterera över alla element i en samling? Med en LinkedList fungerar index, men långsamt: 58 static boolean contains(list<?> haystack, needle) { for (int i = 0; i < haystack.size(); i++) { if (haystack.get(i).equals(needle)) return true; return false; Node<E> get(int index) { Node<E> x = first; for (int j = 0; j < index; j++) x = x.next; return x; i=0: Gå genom element j=0 i=1: Gå genom element j=0, 1 i=2: Gå genom element j=0, 1, 2 i=3: Gå genom element j=0, 1, 2, 3 i=4: Gå genom element j=0, 1, 2, 3, 4

Iteration 3: Utan index Hur kan man iterera över alla element i en samling? Med en generell Collection (eller Set) finns inga index! 59 static boolean contains(collection<?> haystack, needle) { for (int i = 0; i < haystack.size(); i++) { if (haystack.get(i).equals(needle)) return true; return false; Vi är egentligen inte intresserade av index! Vi vill veta: Finns det fler element? Vad är nästa element?

Iteration 4: Iterator Lösning: Gränssnittet Iterator 60 public interface Iterator<E> { public boolean hasnext(); public E next(); Finns det fler element? Vad är nästa element? static boolean contains(iterator<?> haystack, needle) { while (haystack.hasnext()) { element = haystack.next(); if (element.equals(needle)) return true; return false; Specialsyntax: Iterator för vilken elementtyp som helst Vet inte vilken elementtyp men: Det är i alla fall någon sorts!

Iteration 5: Iterable 61 Gränssnittet Iterable säger att objektet kan ge oss en iterator public interface Iterable<E> { public Iterator<E> iterator(); class ArrayList<E> implements List<E>, Iterable<E> { static boolean contains(iterable<?> haystack, needle) { Iterator<?> iter = haystack.iterator(); while (iter.hasnext()) { element = iter.next(); if (element.equals(needle)) return true; return false;

Iteration 6: For(each) En for-loop kan iterera över element i en Iterable static boolean contains(iterable<?> haystack, needle) { for ( element : haystack) { if (element.equals(needle)) return true; return false; 62 Användbart för alla collections och arrayer int[] numbers = new int[rnd()]; for (int i : numbers) { List<String> greetings = new ArrayList<>(); for (String str : greetings) {

Iteration 7: ConcurrentModificationException Om man ändrar en samling medan man itererar över den: ConcurrentModificationException Har inget att göra med multitrådning! static boolean contains(iterable<?> haystack, needle) { for ( element : haystack) { if (element.equals(needle)) return true; if ( ) { ändra i haystack return false; 63

Iteration 8: Ta bort element Iterator har en tredje metod 64 package java.util; public interface Iterator<E> { public boolean hasnext(); public E next(); public void remove(); Ta bort elementet som just returnerades av next() static void removeallcopies(iterable<string> haystack, needle) { Iterator<String> iter = haystack.iterator(); while (haystack.hasnext()) { String element = haystack.next(); if (element.equals(needle)) { iter.remove(); Tas bort via iteratorn ingen ConcurrentModificationException

Iteration 9: ListIterator ListIterator har fler metoder Ändra senast returnerade element Lägg till element innan senast returnerade element Gå framåt och bakåt i listan List<String> greetings = new ArrayList<>(); ListIterator<String> iter = greetings.listiterator(); 65

Iterator för ArrayList 1 Vad behöver en iterator för ArrayList känna till? ArrayListIterator at 0 list pos 0 Lista att iterera över Nuvarande index data size length [0] [1] ArrayList 4 10 67 [9]

Iterator för ArrayList 2 68 public class ArrayList<E> implements List<E> { public Iterator<E> iterator() { return new ArrayListIterator<E>(this); private class ArrayListIterator<E> implements Iterator<E> { private ArrayList<E> list; // Which list should we iterate over? private int pos = 0; // How many element have we returned so far? public ArrayListIterator(final ArrayList<E> list) { this.list = list; public boolean hasnext() { return (pos < list.size()); Finns det flera element? public E next() { final E element = list.get(pos); pos++; return element; Vad är nästa element?

Iterator för ArrayList 3 69 Anta list=["hello","world"]. Iterator it = list.iterator(); while (it.hasnext()) { System.out.println(it.next()); Header list pos it at 0 0 1 2 Första iterationen: it=[list,0]. Testar: it.hasnext() 0 < list.size() returnerar true Anropar: it.next() sätter pos = 1, returnerar "hello". Andra iterationen: it=[list,1]. Testar: it.hasnext() 1 < list.size() returnerar true Anropar: it.next() sätter pos = 2, returnerar "world". Tredje iterationen: it=[list,2]. Testar it.hasnext() 2 < list.size() returnerar false. Avslutar loopen. OBS: Själva listan ändras aldrig!

Iterator för LinkedList 70 public class LinkedList<E> implements List<E> { public Iterator<E> iterator() { return new LinkedListIterator<E>(this); private class LinkedListIterator<E> implements Iterator<E> { private ListNode<E> node; // Which list node are we currently at? public LinkedListIterator(final LinkedList<E> list) { this.node = list.first; public boolean hasnext() { return node.next!= null; LinkedList size first 5 public E next() { final E val = node.value; node = node.next; return value; next prev value value ListNode 12 next prev value value ListNode 14 next prev value value ListNode 16

Iterator för textfiler En iteratorklass för textrader i en fil: public class LineIterator implements Iterator<String> { final BufferedReader file; public LineIterator(String filename) { 71 public boolean hasnext() { return!file.eof(); public String next() { return file.readline();

"Fortsättning" i nästa kurs 72 Mer om datastrukturer: TDDD86 Datastrukturer, algoritmer och programmeringsparadigm http://kdb- 5.liu.se/liu/lith/studiehandboken/svkursplan.lasso?&k_budget_year=2015&k_ku rskod=tddd86