Collection Classes Koppling mellan abstraktioner på hög nivå och praktiska och effektiva implementationer av datastrukturer abstraktionerna: naturliga matematiska begrepp mängder, sekvenser avbildningar (maps/tabeller) Vårt mål: lära lite om CC (mycket användbart) inblick i design av ett avancerat klassbibliotek. bjectorienterad programmering Sida 1
Men först Repetition: Student.java, StudentTest.java Gränssnitt (Interface) Parametriska typer bjectorienterad programmering Sida 2
Interface En slags lättviktsklasser ungefär som abstrakta klasser. Definierar ett interface ( eller protokoll) Ett interface består av ett antal metodnamn med argumenttyper och resultattyper. Ett interface innehåller inte några datastrukturer eller någon programkod. bjectorienterad programmering Sida 3
Interface, första exempel public interface MyInterface { void amethod(int i); } public class MyClass implements MyInterface { public void amethod(int i) {... }... } bjectorienterad programmering Sida 4
Interface (forts) Vi säger att en klass implementerar ett interface. En klass kan bara ärva en annan klass men implementera många interface. Man kan använda interface för att hänga på en klass ytterligare egenskaper. En vanlig variabeldeklaration beskriver hur det data som variabeln lagrar ser ut En variabel som deklareras att vara av ett visst interface: varje objekt som variabeln refererar måste implementera gränssnittet bjectorienterad programmering Sida 5
Exempel på interface i Javas API EventListener Comparable List, Set, Map Iterator bjectorienterad programmering Sida 6
Samlingar (Collections Framework) relativt nytt: Från Java 2 platform, version 1.2 idé: ett litet antal generella gränssnitt (interface) som beskriver mängder, sekvenser, tabeller varje samling implementerar ett eller flera gränssnitt Flera utökningar i Java 5 underlättar: generaliserad for-loop, autoboxing/unboxing, generiska typer bjectorienterad programmering Sida 7
public class Box<X> { private X x; Generiska typer exempel public X getx() { return x; } } public void putx (X x0) { x = x0; } bjectorienterad programmering Sida 8
Genererisk typ test public static void main (String [] arg) { Box<String> b = new Box<String> (); b.putx("foo"); String s = b.getx(); System.out.println(s); } Box<Integer> c = new Box<Integer> (); c.put(42); int i = c.getx(); System.out.println(i); bjectorienterad programmering Sida 9
Allmänt om generiska typer Parametrarna lever bara vid kompileringstillfället. I princip kan ett Java 5-program generera samma bytekod som ett Java 1.4.2-program. Jfr templates i C++. Typ-parametrarna används när kompilatorn kontrollerar programmet och sätter in vissa konverteringar (autobox/unboxing). bjectorienterad programmering Sida 10
Parametriska metoder class Id { public static <T> T id(t x) { return x; } } bjectorienterad programmering Sida 11
Jia: 8.2, Skansholm: 17 Collection Classes Se även Suns tutorial om Collections bjectorienterad programmering Sida 12
Motivation: Vill samla olika datastrukturer för att representera tabeller, mängder, sekvenser i ett standardbibliotek. Viktigt att alla datastrukturer kan hanteras på ett likartat sätt, så att det är lätt att lära sig använda biblioteket man kan lätt ändra val av datastruktur lätt att sätta ihop olika programkomponenter som skickar och tar emot datastrukturer i form av samlingar bjectorienterad programmering Sida 13
Olika slag av samlingar i Java Arrayer (Till exempel: int[]) grundläggande lagrar alla datatyper Vector liknar array men kan expanderas lagrar endast äkta objekt (som definierats i en klass) bjectorienterad programmering Sida 14
Repetition: Interface En slags lättviktsklasser. Beskriver en uppsättning metoder. Man säger att en klass implementerar ett interface. bjectorienterad programmering Sida 15
Collections, ett första exempel Simple.java Simple142.java Samma exempel i gamla Java bjectorienterad programmering Sida 16
Collection Map Interface för samlingar Set List SortedMap SortedSet bjectorienterad programmering Sida 17
Exempel på klasser som implementerar samlingar ArrayList Arrayer. Implementerar List LinkedList Länkade listor. Implementerar List HashMap Hashtabeller. Implementerar Map TreeSet Balanserade binärträd. Implementerar Set, SortedSet bjectorienterad programmering Sida 18
Collection En samling element operationer för att lägga till och ta bort element Konvention: Varje klass K som implementerar Collection har en konstruktor K(Collection c) (som tar en godtycklig samling) Därmed kan man lätt konvertera mellan olika samlingar bjectorienterad programmering Sida 19
Operationer på Collection <E> int size() boolean isempty() boolean contains(object element) boolean remove(object element) boolean add(e element) Iterator<E> iterator() bjectorienterad programmering Sida 20
Operationer på många element boolean containsall(collection<?> c) boolean addall(collection<? extends E> c) boolean removeall(collection<?> c) boolean retainall(collection<?> c) void clear() E[] toarray() bjectorienterad programmering Sida 21
Iteratorer Tre operationer på Iterator<E> boolean hasnext(); E next(); void remove(); bjectorienterad programmering Sida 22
Man kan skriva for(type x : c) { Lite om utökade for-loopar om c är av en typ som implementerar gränssnittet Iterator. Detta översätts till kod som använder iteratorer. (Jfr exemplet Simple.java) Denna notation kan även användas för iteration över arrayer. bjectorienterad programmering Sida 23
Collections: Ett exempel import java.util.*; class A { public static void main(string args[]) { List<String> l = new ArrayList<String>(); for (int i=0; i<args.length; i++) l.add(args[i]); System.out.println(l); } } bjectorienterad programmering Sida 24
Körexempel $ javac A.java $ java A en gång är ingen gång [en, gång, är, ingen, gång] $ bjectorienterad programmering Sida 25
Exempel: LinkedList Program B.java Exempel (med for-loopar) Program C.java bjectorienterad programmering Sida 26
Gränssnittet Set Representerar mängder En samling föremål, utan inbördes ordning samma operationer som Collection Implementeras av HashSet och TreeSet (TreeSet implementerar även SortedSet) bjectorienterad programmering Sida 27
Exempel: HashSet Program: D.java bjectorienterad programmering Sida 28
Gränssnittet SortedSet En mängd som garanterar att dess iterator kommer att traversera mängden enligt elementens naturliga ordning, eller enligt en Comparator (en slags jämförelseoperator) som ges till konstruktorn, Alla element som sätts in i en sorterad mängd måste antingen implementera gränssnittet Comparable (eller accepteras av en given Comparator) bjectorienterad programmering Sida 29
SortedSet<E>, operationer E first() Returnerar första elementet E last() Sista elementet SortedSet subset(e a, E b) returnerar en vy bestående av alla element i mängden från och med element a fram till (men exklusive) element b bjectorienterad programmering Sida 30
Exempel: TreeSet public class E { public static void main(string args[]) { Set<String> l = new TreeSet<String>(); for (String s : args) l.add(s); } } System.out.println(l); bjectorienterad programmering Sida 31
Körexempel TreeSet $ javac E.java $ java E bättre en fågel i handen än tio i skogen [bättre, en, fågel, handen, i, skogen, tio, än] $ java E ö åra älv [älv, åra, ö] $ bjectorienterad programmering Sida 32
Kort mellanspel 1 Gränssnittet Comparator<E> definierar metoden public int compare(e o1, E o2) som jämför sina två argument och returnerar ett negativt tal om första argumentet är mindre än det andra noll om dom är lika ett positivt tal om första argumentet är större. bjectorienterad programmering Sida 33
Kort mellanspel 2 Svensk sortering Klassen Locale representerar en geografisk, politisk eller kulturell region. Skriv new Locale("sv", "se") för svenska språket (sv) och Sverige (se). Klassen Collator implementerar gränssnittet Comparator<Object>. Den har en statisk metod Collator getinstance(locale desiredlocale) som skapar en jämförelseoperator för en given region. bjectorienterad programmering Sida 34
Exempel: Svensk sortering class F { public static void main(string args[]) { Collator collator = Collator.getInstance(new Locale("sv", "se")); SortedSet l = new TreeSet(collator); [...] }} bjectorienterad programmering Sida 35
Körexempel: Svensk sortering $ javac F.java $ java E Ögren Vallander Vikström Wiklund Åberg Änglund [Vallander, Vikström, Wiklund, Änglund, Åberg, Ögren] $ java F Ögren Vallander Vikström Wiklund Åberg Änglund [Vallander, Wiklund, Vikström, Åberg, Änglund, Ögren] $ bjectorienterad programmering Sida 36
Gränssnittet List<E> En sekvens av objekt där samma objekt kan förekomma flera gånger Operationer ur Collection E get(int index) E set(int index, E element) get set E add(int index, E element) int indexof(e element) bjectorienterad programmering Sida 37
Gränssnittet List: implementationer List implementeras av ArrayList och LinkedList ArrayList Access via position är snabbt. Att skjuta in eller ta bort element (med add och remove) är dyrt. LinkedList Access via position är dyrt. bjectorienterad programmering Sida 38
Gränssnittet Map<K,V> En avbildning, eller tabell Skansholm: Avbildningstabell Idé: En association mellan objekt. (K nycklar; V värden) Exempel: en telefonkatalog. Givet ett namn kan vi ta fram telefonnummer Implementeras av HashMap<K,V> och TreeMap<K, V> TreeMap<K, V> implementerar även SortedMap<K, V> bjectorienterad programmering Sida 39
Gränssnittet Map<K, V>: operationer V put(k key, V value) V get(object key) V remove(object key) boolean containskey(object key) boolean containsvalue(object key) int size() boolean isempty() bjectorienterad programmering Sida 40
Gränssnittet Map (forts) void putall(map<? extends K,? extends V> t) void clear() Set<K> keyset() Collection values() Set<V> entryset() Gränssnittet Map.Entry<K, V>: K getkey() V getvalue() V setvalue(v) bjectorienterad programmering Sida 41
Hitta duplicerade ord med HashSet Program: FindDups.java, FindDups2.java bjectorienterad programmering Sida 42
Autoboxing/unboxing, bakgrund För var och en av de åtta primitiva datatyperna finns en motsvarande klass, tex int Integer boolean Boolean Man kan konvertera mellan genom att skriva Integer x = new Integer(42); int y = x.intvalue(); bjectorienterad programmering Sida 43
Autoboxing/unboxing i java 5.0 I Java 5.0 sker konverteringen automatiskt, man kan skriva Integer x = 42; int y = x; Man kan klara sig utan de primitiva typerna: Integer s = 0; for (Integer i = 0; i<10; i++) { s = s + i; Antagligen ej att rekommendera! (Varför inte?) bjectorienterad programmering Sida 44
Räkna antal förekomster Program: Freq.java, Freq2.java bjectorienterad programmering Sida 45
Kort mellanspel: Klassen StringBuffer Exempel: x = "a" + 4 + "c" kan även skrivas x = new StringBuffer().append("a").append(4).append("c").toString() Konstruktorer: StringBuffer(String s) StringBuffer(int l) Metoder bjectorienterad programmering Sida 46
StringBuffer append (boolean b) char charat(int i) void setcharat(int i, char c) String tostring() bjectorienterad programmering Sida 47
Perm2.java Problem: Givet en fil med ord, hitta ord som är varandras permutationer. Lösning: Definiera en funktion alphabetize som tar en sträng och returnerar en sträng med bokstäverna i alfabetisk ordning. Bygg en tabell Map<String,List<String>> där strängarna läggs in enligt den alfabetiserade nyckeln. Två strängar med samma nyckel är varandras permutationer och hamnar på samma lista. bjectorienterad programmering Sida 48
Definiera en egen ordning på strängar (CaseInsensitiveComparator). Definiera en klass med en egen ordning (Person) enligt: 1. Ordna först efter namn, 2. sen efter ålder En klass med egen ordning, Person2, som låter alla över 65 få företräde. bjectorienterad programmering Sida 49