Föreläsning 2 Innehåll

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

Föreläsning 2 Innehåll

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

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

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

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

Föreläsning 3-4 Innehåll

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

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

Föreläsning 4 Innehåll

Föreläsning 9 Innehåll

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

Föreläsning 11 Innehåll

Interfacen Set och Map, hashtabeller

Föreläsning 3 Innehåll

Diskutera Sortera objekt

Diskutera. Hashfunktion

Föreläsning 10 Innehåll

EDAA01 Programmeringsteknik - fördjupningskurs

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 1-2. Språkkonstruktioner i Java. Introduktion till delar av Javas klassbibliotek

Föreläsning Innehåll. Hantera många element. Exempel: polygon Godtyckligt antal element. Exempel: polygon forts

Länkade strukturer. (del 2)

Inlämningsuppgift och handledning

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

Föreläsning 10 Innehåll. Diskutera. Hashtabeller. Hashfunktion. hashfunktion. hashkod (ett heltal)

Inlämningsuppgift och handledning. Föreläsning 11 Innehåll. Diskutera. Hashtabeller

Föreläsning 1-2 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta kan du... Förkunskaper

DAT043 - föreläsning 8

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

Föreläsning 14 Innehåll

Repetition av OOP- och Javabegrepp

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

Repetition av OOP- och Javabegrepp

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

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

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

Arrayer. results

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

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

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

Lösningsförslag till tentamen i EDAA01 programmeringsteknik fördjupningkurs

OOP Objekt-orienterad programmering

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

Samlingar Collection classes

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning Innehåll. Checklista. Några metoder i klassen ArrayList<E> Exempel på vad du ska kunna

Sammansatta datatyper Generics: Parametrisk polymorfism

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

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

Föreläsning REPETITION & EXTENTA

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

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

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

Föreläsning 10 Innehåll

Stackar, köer, iteratorer och paket

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Objektorienterad programmering med Java, Generics

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

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Tentamen, EDAA01 Programmeringsteknik fördjupningskurs

Samlingar Collection classes

Programmering fortsättningskurs

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

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

Tentamen, EDA690 Algoritmer och Datastrukturer, Helsingborg

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

TDDD78 Viktiga begrepp, del 2

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

Lösningsförslag till tentamen i EDA690 Algoritmer och Datastrukturer, Helsingborg

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Objektorienterad Programmering (TDDC77)

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Föreläsning 3-4 Innehåll

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

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

Laboration A Objektsamlingar

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

Collection Classes. bjectorienterad programmering Sida 1

Föreläsning 1 Innehåll. EDAA01 Programmeringsteknik - fördjupningskurs. Detta ska du lära dig... Kursens mål. Detta kan du...

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

DAT043 Objektorienterad Programmering

Programmeringsteknik - fördjupningskurs

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

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

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

Föreläsning 13 Innehåll

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

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

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

TENTAMEN OOP

Objektorienterad Programkonstruktion

Generiska datatyper. Parametrisk Polymorfism: Generics. Generisk lista. Utvikning: Typer

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Transkript:

Föreläsning 2 Innehåll Java Collections Framework (interface och klasser för samlingar av element) Använda generiska klasser autoboxing - och unboxing Iterera genom en samling element Jämföra element skugga equals implementera Comparable Datavetenskap (LTH) Föreläsning 2 HT 2017 1 / 54

Java Collections Framework Är en hierarki av interface, abstrakta klasser och konkreta klasser för samlingar av element. Dokumentation av Javas standardklasser och interface finns på Javas webbsida. Där finns även tuturials, bl.a. om Javas Collection-klasser. Basen i hierarkin är ett interface Collection: interface Collection<E> { boolean add(e x); boolean contains(object x); boolean remove(object x); boolean isempty(); int size();... Datavetenskap (LTH) Föreläsning 2 HT 2017 2 / 54

Java Collections Framework interface hierarki <<Interface>> Collection <<Interface>> Map <<Interface>> Queue <<Interface>> List <<Interface>> Set <<Interface>> SortedMap <<Interface>> Deque <<Interface>> SortedSet Datavetenskap (LTH) Föreläsning 2 HT 2017 3 / 54

Java Collections Framework interface hierarki Collection en samling av element, där dubbletter tillåts List en samling element där positionering är möjlig (första, sista, element på plats i,...) Queue en samling av element som utgör en kö Deque som Queue men man kan sätta in och ta ut element både i början och i slutet av kön Set en samling element där dubbletter är förbjudna SortedSet som Set men med krav att elementen går att jämföra Map en samling nyckel-värde-par (jfr. lexikon) SortedMap som Map men med krav att nycklarna går att jämföra Datavetenskap (LTH) Föreläsning 2 HT 2017 4 / 54

Java Collections Framework några klasser Interface Queue Deque List Set SortedSet Map SortedMap Klass ArrayDeque, LinkedList, PriorityQueue ArrayDeque, LinkedList ArrayList, LinkedList HashSet TreeSet HashMap TreeMap Datavetenskap (LTH) Föreläsning 2 HT 2017 5 / 54

Generiska klasser Bakgrund Klasser bör implementeras så att de blir generella d.v.s. går att använda i många olika sammanhang. En klass som hanterar en lista av element ska inte skrivas så att den bara kan hantera listor med heltal. Men vi vill inte ha en lista där vi kan sätta in objekt hur som helst. I en lista med heltal vill vi inte av misstag kunna sätta in String-objekt. 42 5 "abc" 5 Datavetenskap (LTH) Föreläsning 2 HT 2017 6 / 54

Generik i Java Vi kan deklarera typparametrar när vi definierar en klass. Ex: public class ArrayList<E> {... Vid användning av en generisk klass anges ett typargument (ett klassnamn): ArrayList<Integer> mylist = new ArrayList<Integer>(); Datavetenskap (LTH) Föreläsning 2 HT 2017 7 / 54

Generik i Java Kompilatorn kommer att upptäcka typfel. Ex: ArrayList<Integer> mylist = new ArrayList<Integer>(); mylist.add("abc"); ger nu kompileringsfel, mylist får enligt sin deklaration endast innehålla objekt av typen Integer. Datavetenskap (LTH) Föreläsning 2 HT 2017 8 / 54

Exempel på en generisk klass java.util.arraylist Utdrag ur den generiska klassen java.util.arraylist: public class ArrayList<E> { public ArrayList() {... public boolean add(e x) {... public void add(int index, E x) {... public E get(int index) {...... Alla add-metoder har inparameter av typen E. Därför kan enbart objekt av klassen E (eller subklasser till denna) sättas in i listan. Datavetenskap (LTH) Föreläsning 2 HT 2017 9 / 54

Exempel på en generisk klass java.util.arraylist, forts Observera att inte alla metoder i ArrayList<E> har E som typparameter. T.ex. har contains och remove följande signaturer: public boolean contains(object x); public boolean remove(object x); Användare som inte känner till den exakta typen av ett element x ska kunna anropa metoderna. Dock kommer man att få resultat true om och endast om x finns i listan (och alltså även är av rätt typ). Datavetenskap (LTH) Föreläsning 2 HT 2017 10 / 54

Restriktioner för typargument Typargumentet får inte vara av primitiv typ: List<int> list = new ArrayList<int>(); // Går inte! Istället får man använda motsvarande wrapperklass: List<Integer> list = new ArrayList<Integer>(); Datavetenskap (LTH) Föreläsning 2 HT 2017 11 / 54

Primitiva datatyper - wrapperklasser Primitiva typer i Java: boolean short int long char byte float double Motsvarande wrapperklasser: Boolean Short Integer Long Character Byte Float Double Datavetenskap (LTH) Föreläsning 2 HT 2017 12 / 54

Primitiva datatyper - wrapperklasser Exempel int a = 42; Integer b = new Integer(42); a b 42 42 Variabeln a har värdet 42, medan variabeln b innehåller en referens till ett Integer-objekt. Datavetenskap (LTH) Föreläsning 2 HT 2017 13 / 54

Diskutera Antag att vi lagrar heltal i en lista: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(5); int j = list.get(0); Hur kan detta fungera? Listan innehåller Integer-objekt. På andra raden sätter vi in ett heltal (typen int). På tredje raden har vi deklarerat en variabel j av typen int. Men metoden get returnerar en referens till ett Integer-objekt. Datavetenskap (LTH) Föreläsning 2 HT 2017 14 / 54

Autoboxing unboxing Autoboxing automatisk konvertering från primitiv typ till objekt av motsvarande wrapperklass Unboxing automatisk konvertering av objekt av wrapperklass till motsvarande primitiva typ Exempel: Integer k = 3; // autoboxing int j = k; // unboxing Integer i = new Integer(2); i = i + 1; // Unboxing av i för att beräkna i+1. // Därefter autoboxing av resultatet vid // tilldelningen. I tidiga versioner av Java var man tvungen att skriva i = new Integer(i.intValue() + 1); Datavetenskap (LTH) Föreläsning 2 HT 2017 15 / 54

Autoboxing unboxing i samband med generiska klasser Praktiskt när man vill använda en generisk klass för att lagra element av primitiv typ. Ex: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(5); // Autoboxing till Integer-objekt här.... int j = list.get(0); // Unboxing till int här. Datavetenskap (LTH) Föreläsning 2 HT 2017 16 / 54

Generisk klass med flera typparametrar Exempel: Interfacet Map<K, V> och klassen HashMap<K, V> har två typparametrar. K som i key, V som i value Exempel på användning: Map<String, Integer> map = new HashMap<String, Integer>(); map.put("june", 30); Datavetenskap (LTH) Föreläsning 2 HT 2017 17 / 54

Exempel på användning av klassen Map Map<String, Integer> map = new HashMap<String, Integer>(); map.put("januari", 31); map.put("februari", 28); map.put("mars", 31); map.put("april", 30); map.put("maj", 31);... System.out.println("Antal dagar i mars: " + map.get("mars")); Datavetenskap (LTH) Föreläsning 2 HT 2017 18 / 54

Diskutera Antag att vi lagrar ett antal tal i en samling element, t ex en lista eller en mängd: List<Integer> list = new ArrayList<Integer>(); // här sätts tal in i listan Set<Integer> set = new HashSet<Integer>(); // här sätts tal in i mängden Hur ska vi göra för iterera genom en samling element och behandla alla elementen (t.ex. summera talen i listan respektive mängden)? Datavetenskap (LTH) Föreläsning 2 HT 2017 19 / 54

Iteratorer För att iterera genom (traversera) listor eller andra samlingar kan man använda ett iteratorobjekt. Ett iteratorobjekt håller reda på en position i listan: Datavetenskap (LTH) Föreläsning 2 HT 2017 20 / 54

Iteratorer Interfacet Iterator<E> Ett iterator-objekt är en instans av en klass som implementerar interfacet Iterator<E>. public interface Iterator<E> { /** Returns true if the iteration has more elements. */ boolean hasnext(); /** Returns the next element in the iteration. */ E next(); /** Removes from the underlying collection the last element returned by the iterator (optional). */ void remove();... Datavetenskap (LTH) Föreläsning 2 HT 2017 21 / 54

Användning av iterator Exempel Summera talen i listan list av typen ArrayList<Integer>: Iterera genom listan med explicit iterator: Iterator<Integer> itr = list.iterator(); int sum = 0; while (itr.hasnext()) { int i = itr.next(); sum += + i; Samma sak med for-each-sats: int sum = 0; for (int i : list) { sum += i; Datavetenskap (LTH) Föreläsning 2 HT 2017 22 / 54

Användning av iterator Vanliga fel Iteratorobjektet skapas inuti metoden iterator(). Iterator<Integer> itr = new Iterator(); // FEL Iterator<Integer> itr = list.iterator(); // RÄTT För varje anrop av next() hoppar iteratorn fram ett steg i listan. while (itr.hasnext()) { if (itr.next() > 0) { // FEL - next anropas flera gånger sum = += itr.next(); while (itr.hasnext()) { int i = itr.next(); if (i > 0) { sum = += i; // RÄTT Datavetenskap (LTH) Föreläsning 2 HT 2017 23 / 54

Iteratorer under huven Till ArrayList<E> hör en speciell iteratorklass (vars namn vi inte vet). Denna iteratorklass implementerar interfacet Iterator<E>. I iteratorklassen finns attribut som håller reda på iteratorns position. I klassen ArrayList<E> finns en metod iterator() som returnerar en referens till ett nyskapat iteratorobjekt. list itr... 0 Datavetenskap (LTH) Föreläsning 2 HT 2017 24 / 54

Interfacet Iterable<E> I Java finns också följande interface: public interface Iterable<E> { /** Returns an iterator over a set of elements of type E */ Iterator<E> iterator();... Interfacet Collection ärver interfacet Iterable: public interface Collection<E> extends Iterable<E>... Alla klasser som implementerar Collection måste alltså implementera metoden iterator(). Man kan alltså använda en iterator på objekt av alla dessa klasser. Datavetenskap (LTH) Föreläsning 2 HT 2017 25 / 54

Java Collections Framework interface hierarki med Iterable<E> och Iterator<E> <<Interface>> Iterable iterator() <<Interface>> Queue <<Interface>> Collection <<Interface>> List <<Interface>> Set <<Interface>> Iterator hasnext() next() remove() <<Interface>> Map <<Interface>> SortedMap <<Interface>> Deque <<Interface>> SortedSet Datavetenskap (LTH) Föreläsning 2 HT 2017 26 / 54

Interfacet ListIterator I klasser som implementerar interfacet List finns även dessa metoder: /** Returnerar en listiterator som startar i pos i. */ public ListIterator listiterator(int i); /** Returnerar en listiterator som startar i pos 0. */ public ListIterator listiterator(); ListIterator<E> är ett interface som ärver Iterator<E> och där man lagt till metoder för att röra sig även bakåt i listor samt för att sätta in element. Datavetenskap (LTH) Föreläsning 2 HT 2017 27 / 54

Interfacet ListIterator <<Interface>> Iterator <<Interface>> ListIterator public interface ListIterator<E> extends Iterator<E> { boolean hasprevious(); E previous(); void add(e x);... Datavetenskap (LTH) Föreläsning 2 HT 2017 28 / 54

foreach-sats i Java Exempel ArrayList<String> words = new ArrayList<String>(); // här sätts String-objekt in listan words... for (String s : words) { // behandla s Ett sätt att enkelt iterera över samlingar. Man slipper att explicit använda en iterator. Men hasnext() och next() anropas i bakgrunden. for (String s : words)... kan läsas som för varje s i words. Kan användas för objekt av klasser som implementerar Iterable och för vektorer. Datavetenskap (LTH) Föreläsning 2 HT 2017 29 / 54

foreach-sats Vektorer Kan också användas för att iterera över elementen i en vektor. Ex: En metod som skriver ut alla strängarna i en vektor av typ String[]: public void print(string[] a) { for (String s : a) { System.out.println(s); Datavetenskap (LTH) Föreläsning 2 HT 2017 30 / 54

foreach-sats Begränsningar Foreach-sats kan inte användas när man explicit behöver tillgång till iteratorn i koden. T.ex. vid borttagning av element under itereringen: Iterator<Integer> itr = list(); while (itr.hasnext()) { if (itr.next() < 0) { itr.remove(); OBS! Man får inte använda listans egna metoder för att lägga till eller ta bort element under itereringen. Använd iteratorns metod remove istället. Listans metod removeif kan också användas. Datavetenskap (LTH) Föreläsning 2 HT 2017 31 / 54

foreach-sats Begränsningar Foreach-sats kan inte användas för att iterera parallellt över flera samlingar, motsvarande följande kod: ArrayList<Person> list1, list2;... Iterator<Person> itr1 = list1.iterator(); Iterator<Person> itr2 = list2.iterator(); while(itr1.hasnext() && itr2.hasnext()) { System.out.println(itr1.next() + " " + itr2.next()); Datavetenskap (LTH) Föreläsning 2 HT 2017 32 / 54

Nästlad foreach-sats Däremot går det bra med nästlade loopar. Ex: Skriv ut alla kombinationer av strängar str1 str2 där str1 finns i vektorn first och str2 finns i vektorn second. first och second är av typen String[] : for (String f : first ) { for (String s : second) { System.out.println(f + " " + s); Datavetenskap (LTH) Föreläsning 2 HT 2017 33 / 54

Traversera elementen i en samling Java 8 - kul att veta Fr.o.m. Java 8 finns metoden foreach i interfacet Iterable. Exempel: ArrayList<Integer> list = new ArrayList<Integer>(); list.add(10); list.add(11); list.add(12); list.foreach(e -> System.out.println(e)); // skriver ut alla tal list.foreach(e -> { // skriver ut alla jämna tal if (e % 2 == 0) { System.out.println(e); ); Det som skicka med som argument till metoden foreach är ett lambdauttryck ett stycke kod som ska exekveras senare, i det här fallet när metoden foreach anropas. (Lambdauttryck behandlas senare under kursen.) Datavetenskap (LTH) Föreläsning 2 HT 2017 34 / 54

Filtrering med metoden removeif Java 8 - kul att veta I interfacet Collection finns metoden removeif som kan användas för att filtrera bort element ur en lista. Exempel 1: Filtrera bort alla negativa tal ur listan list: list.removeif(n -> n < 0); Exempel 2: Filtrera bort alla udda tal ur listan list: list.removeif(n -> n % 2!= 0); Argumentet är ett lambdauttryck (behandlas senare under kursen). Datavetenskap (LTH) Föreläsning 2 HT 2017 35 / 54

Strömmar Java 8 - kul att veta Man kan även använda strömmar för att behandla alla element i en samling eller en vektor. Exempel 1: Skriv ut alla personerna i listan plist: plist.stream().foreach(p -> System.out.println(p)); Exempel 1: Skriv ut alla personer i listan plist som matchar x: plist.stream().filter(p -> p.equals(x)).foreach(p -> System.out.println(p)); Du kan läsa mer om strömmar här: https://docs.oracle.com/javase/tutorial/collections/streams/ Datavetenskap (LTH) Föreläsning 2 HT 2017 36 / 54

Diskutera Följande klass beskriver en person: public class Person { private String name; private int id; public Person (String name, int id) { this.name = name; this.id = id; Vad skrivs ut när följande rader exekveras? Förklara varför? ArrayList<Person> list = new ArrayList<Person>(); list.add(new Person("Fili", 1)); list.add(new Person("Balin", 2)); System.out.println(list.contains(new Person("Balin", 2))); Datavetenskap (LTH) Föreläsning 2 HT 2017 37 / 54

Jämföra likhet Metoden equals Inuti ArrayList används metoden equals för att jämföra om två objekt är lika: if (o1.equals(o2)) {... Metoden equals finns i superklassen Object. Den returnerar true om och endast om de jämförda objekten är identiska. Den testar referenslikhet och fungerar alltså som ==. Om vi istället vill att innehållet inuti objekten ska jämföras (här id-numren) måste vi skugga equals klassen Person. Skiss, ej färdig equals-metod: public boolean equals(object obj) { return id == ((Person) obj).id; Datavetenskap (LTH) Föreläsning 2 HT 2017 38 / 54

Söka i Javas listklasser Sökmetoder som använder equals internt List<Person> list = new ArrayList<Person>(); list.add(new Person("Kili", 1)); list.add(new Person("Balin", 2)); // sök efter platsen för elementet med id-nummer 2 int index = list.indexof(new Person(null, 2)); // tag reda på om det finns ett element med id-nummer 2 i listan boolean found = list.contains(new Person(null, 2)); // tag bort elementet med id-nummer 2 ur listan boolean removed = list.remove(new Person(null, 2)); Datavetenskap (LTH) Föreläsning 2 HT 2017 39 / 54

Skugga equals att tänka på Parametern till equals måste vara av typ Object, annars blir det inte skuggning och den ursprungliga metoden i klassen Object kommer att användas. De attribut som används i jämförelsen inuti equals bör inte gå att ändra. Deklarera dem final: public class Person { private String name; private final int id;... Annars kan det bli svårt att hitta objektet när det satts in i en lista. När man skuggar equals bör man också skugga metoden hashcode. Metoderna equals och hashcode används när objekt sätts in i en hashtabell. (Behandlas senare i kursen). Datavetenskap (LTH) Föreläsning 2 HT 2017 40 / 54

Skugga equals Specifikation public boolean equals(object obj); Ur equals specifikation: x.equals(x) ska returnera true (reflexivitet). Om x.equals(y) returnerar true så ska y.equals(x) returnera true (symmetri). Om x.equals(y) returnerar true och y.equals(z) returnerar true så ska x.equals(z) returnera true (transitivitet). Upprepade anrop av x.equals(y) ska ge samma resultat (konsistens). x.equals(null) ska returnera false. Datavetenskap (LTH) Föreläsning 2 HT 2017 41 / 54

Omdefiniera equals med instanceof public boolean equals(object obj) { if (obj instanceof Person) { return idnbr == ((Person) obj).idnbr; else { return false; Observera att parametern till equals måste vara av typ Object, annars blir det inte skuggning. Därför måste också typomvandling till Person ske när man ska använda obj:s idnbr. Uttrycket obj instanceof Person returnerar true om obj:s typ är Person eller någon subklass till Person. Uttrycket obj instanceof Person returnerar false om obj har värdet null. Datavetenskap (LTH) Föreläsning 2 HT 2017 42 / 54

Skugga (skugga) equals med instanceof Fördelar och nackdelar Denna lösningen tillåter att subklasser ärver equals-metoden. Man kan därför använda equals i en arvshieariki och jämföra subklassobjekt och superklassobjekt. Kan leda till att equals inte uppfyller kraven i specifikationen om man skuggar equals i subklassen. Därför är det lämpligt att deklarera metoden equals final: public final boolean equals(object obj) {... Nu kan inte equals skuggas i någon subklass till Person. Detta undviks om man bara tillåter jämförelser mellan objekt av samma typ. Se nästa bild. Datavetenskap (LTH) Föreläsning 2 HT 2017 43 / 54

Skugga equals med getclass public boolean equals(object obj) { if (obj == this) { return true; if (obj == null) { return false; if (this.getclass()!= obj.getclass()) { return false; return id == ((Person) obj).id; Metoden getclass returnerar typen för det objekt obj refererar till under exekveringen. Bara metoder av exakt samma klass kan anses vara lika. Datavetenskap (LTH) Föreläsning 2 HT 2017 44 / 54

Skugga equals med extra metod canequal Ibland blir lösningen på förra bilden för sträng. Det kan man lösa genom att lägga till en extra metod i klassen: public boolean equals(object obj) { if (obj instanceof Person) { Person other = (Person) obj; return other.canequal(this) && this.id == other.id; else { return false; public boolean canequal(object other) { return (other instanceof Person); Bägge metoderna ska skuggas i subklasser. För detaljer läs mer här: www.artima.com/lejava/articles/equality.html Datavetenskap (LTH) Föreläsning 2 HT 2017 45 / 54

Skugga tostring I klassen Object finns också metoden tostring() som bör skuggas. Metoden ska returnera en sträng som representerar objektet: public class Person { private String name; private int id;... public String tostring() { return name + " " + id; Metoden tostring anropas bl.a. vid utskrift av objekt: System.out.println(p); Datavetenskap (LTH) Föreläsning 2 HT 2017 46 / 54

Javas klasser skuggar equals I Javas färdiga klasser skuggas equals, hashcode och tostring. Man behöver inte själv tänka på att skugga equals om man använder någon av Javas klasser som typargument: List<String> names = new ArrayList<String>(); list.names("kili")); list.names("balin"); // sök efter platsen för namnet "Balin" int index = list.indexof("balin"); // index får värdet 1 Datavetenskap (LTH) Föreläsning 2 HT 2017 47 / 54

Diskutera Sortera objekt Klassen Person beskriver en person. Vad händer när följande rader exekveras? Förklara varför? Person[] persons = new Person[4]; persons[0] = new Person("Kili", 1); persons[1] = new Person("Balin", 2); persons[2] = new Person("Dori", 4); persons[3] = new Person("Fili", 3); Arrays.sort(persons); for(person p : persons) { System.out.println(p); Datavetenskap (LTH) Föreläsning 2 HT 2017 48 / 54

Interfacet Comparable Specifikation I Java finns ett generiskt interface, Comparable<T>: public interface Comparable<T> { /** * Compares this object with the specified object for order. * Returns a negative integer, zero, or a positive integer as * this object is less than, equal to, or greater than the * specified object. */ public int compareto(t x); Objekt av klasser som implementerar detta interface går att jämföra med varandra och kan t.ex. sorteras. Inuti metoden sort används Comparable som typ för de element som ska sorteras. Datavetenskap (LTH) Föreläsning 2 HT 2017 49 / 54

Implementering av interfacet Comparable Exempel public class Person implements Comparable<Person> { private String name; private int id;... public int compareto(person obj) { return Integer.compare(id, obj.id); Datavetenskap (LTH) Föreläsning 2 HT 2017 50 / 54

Jämföra likhet Metoderna compareto och equals Interfacet Comparable innehåller bara metoden compareto. Men för klasser som implementerar interfacet Comparable finns det två sätt att jämföra avseende likhet: Person p1 =...; Person p2 = ;... if (p1.compareto(p2) == 0) {... if (p1.equals(p2)) {... Båda sätten att jämföra bör ge konsistenta resultat. Därför bör metoden equals skuggas i klasser som implementerar Comparable. Datavetenskap (LTH) Föreläsning 2 HT 2017 51 / 54

Implementering av interfacet Comparable Övning Övning Ändra klassen Person så att den implementerar interfacet Comparable. Jämförelsen av Person-objekt ska göras med avseende på namnet. public class Person { private String name; private int id;... Datavetenskap (LTH) Föreläsning 2 HT 2017 52 / 54

Exempel på vad du ska kunna Ha kännedom om Java Collection Framework Förklara begreppet generik, kunna använda respektive implementera generiska klasser Förklara begreppen wrapperklass, autoboxing och unboxing Använda en iterator för att traversera en samling element Skugga metoden equals Implementera interfacet Comparable Datavetenskap (LTH) Föreläsning 2 HT 2017 53 / 54

Datorlaboration 1 Abstrakta datatyper Räkna hur många gånger olika ord förekommer i en text. Använd en map för att hålla reda på ord och deras frekvens. I programmet ska du använda interface och klasser från Java Collection Framework. Tips! Se Javas dokumentation för nätet för de klasser du använder. Innehåll: abstrakta datatyperna lista, mängd, map. Använda generiska klasser. Datavetenskap (LTH) Föreläsning 2 HT 2017 54 / 54