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. Interface, första exempel public interface MyInterface { void amethod(int i); public class MyClass implements MyInterface { public void amethod(int i) {...... Objectorienterad programmering Sida 1 Objectorienterad programmering Sida 3 Interface (forts) Vi säger att en klass implementerar ett interface. Men först Repetition: Student.java, StudentTest.java Gränssnitt (Interface) Parametriska typer 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 Objectorienterad programmering Sida 2 Objectorienterad programmering Sida 4
Generiska typer exempel Exempel på interface i Javas API public class Box<X> { private X x; EventListener Comparable List, Set, Map Iterator public X getx() { return x; public void putx (X x0) { x = x0; Objectorienterad programmering Sida 5 Objectorienterad programmering Sida 7 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 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); varje samling implementerar ett eller flera gränssnitt Flera utökningar i Java 5 underlättar: generaliserad for-loop, autoboxing/unboxing, generiska typer Box<Integer> c = new Box<Integer> (); c.put(42); int i = c.getx(); System.out.println(i); Objectorienterad programmering Sida 6 Objectorienterad programmering Sida 8
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). Jia: 8.2, Skansholm: 17 Collection Classes Se även Suns tutorial om Collections Objectorienterad programmering Sida 9 Objectorienterad programmering Sida 11 Motivation: Parametriska metoder class Id { public static <T> T id(t x) { return x; 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 Objectorienterad programmering Sida 10 Objectorienterad programmering Sida 12
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) Collections, ett första exempel Simple.java Simple142.java Samma exempel i gamla Java Objectorienterad programmering Sida 13 Objectorienterad programmering Sida 15 Interface för samlingar Repetition: Interface En slags lättviktsklasser. Beskriver en uppsättning metoder. Man säger att en klass implementerar ett interface. Collection Map Set List SortedMap SortedSet Objectorienterad programmering Sida 14 Objectorienterad programmering Sida 16
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 Operationer på Collection <E> int size() boolean isempty() boolean contains(object element) boolean remove(object element) boolean add(e element) Iterator<E> iterator() Objectorienterad programmering Sida 17 Objectorienterad programmering Sida 19 Collection Operationer på många element 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 boolean containsall(collection<?> c) boolean addall(collection<? extends E> c) boolean removeall(collection<?> c) boolean retainall(collection<?> c) void clear() E[] toarray() Objectorienterad programmering Sida 18 Objectorienterad programmering Sida 20
Collections: Ett exempel import java.util.*; Iteratorer Tre operationer på Iterator<E> boolean hasnext(); E next(); void remove(); 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); Objectorienterad programmering Sida 21 Objectorienterad programmering Sida 23 Lite om utökade for-loopar Man kan skriva for(type x : c) { om c är av en typ som implementerar gränssnittet Iterator. Detta översätts till kod som använder iteratorer. (Jfr exemplet Simple.java) Körexempel $ javac A.java $ java A en gång är ingen gång [en, gång, är, ingen, gång] $ Denna notation kan även användas för iteration över arrayer. Objectorienterad programmering Sida 22 Objectorienterad programmering Sida 24
Exempel: LinkedList Program B.java Exempel: HashSet Exempel (med for-loopar) Program: D.java Program C.java Objectorienterad programmering Sida 25 Objectorienterad programmering Sida 27 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) 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) Objectorienterad programmering Sida 26 Objectorienterad programmering Sida 28
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 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, ö] $ Objectorienterad programmering Sida 29 Objectorienterad programmering Sida 31 Exempel: TreeSet public class E { public static void main(string args[]) { Set<String> l = new TreeSet<String>(); for (String s : args) l.add(s); 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 System.out.println(l); noll om dom är lika ett positivt tal om första argumentet är större. Objectorienterad programmering Sida 30 Objectorienterad programmering Sida 32
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) 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] $ som skapar en jämförelseoperator för en given region. Objectorienterad programmering Sida 33 Objectorienterad programmering Sida 35 Exempel: Svensk sortering class F { public static void main(string args[]) { Collator collator = Collator.getInstance(new Locale("sv", "se")); SortedSet l = new TreeSet(collator); [...] 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) Objectorienterad programmering Sida 34 Objectorienterad programmering Sida 36
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. 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() Objectorienterad programmering Sida 37 Objectorienterad programmering Sida 39 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> 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) Objectorienterad programmering Sida 38 Objectorienterad programmering Sida 40
Autoboxing/unboxing i java 5.0 I Java 5.0 sker konverteringen automatiskt, man kan skriva Hitta duplicerade ord med HashSet Program: FindDups.java, FindDups2.java 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?) Objectorienterad programmering Sida 41 Objectorienterad programmering Sida 43 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 Räkna antal förekomster Program: Freq.java, Freq2.java Integer x = new Integer(42); int y = x.intvalue(); Objectorienterad programmering Sida 42 Objectorienterad programmering Sida 44
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 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. Objectorienterad programmering Sida 45 Objectorienterad programmering Sida 47 StringBuffer append (boolean b) char charat(int i) void setcharat(int i, char c) String tostring() 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. Objectorienterad programmering Sida 46 Objectorienterad programmering Sida 48