• No results found

Collection Classes

N/A
N/A
Protected

Academic year: 2021

Share "Collection Classes"

Copied!
12
0
0

Loading.... (view fulltext now)

Full text

(1)

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.

Objectorienterad programmering Sida 1

Collection classes Sven-Olof Nyström

Men först

• Repetition: Student.java, StudentTest.java

• Gränssnitt (Interface)

• Parametriska typer

Interface, första exempel

public interface MyInterface { void aMethod(int i);

}

public class MyClass implements MyInterface { public void aMethod(int i) {

...

} ...

}

Objectorienterad programmering Sida 3

Collection classes Sven-Olof Nyström

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

(2)

Exempel på interface i Javas API

• EventListener

• Comparable

• List, Set, Map

• Iterator

Objectorienterad programmering Sida 5

Collection classes Sven-Olof Nyström

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

Generiska typer–exempel

public class Box<X> { private X x;

public X getX() { return x;

}

public void putX (X x0) { x = x0;

} }

Objectorienterad programmering Sida 7

Collection classes Sven-Olof Nyström

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);

}

(3)

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).

Objectorienterad programmering Sida 9

Collection classes Sven-Olof Nyström

Parametriska metoder

class Id {

public static <T> T id(T x) { return x;

} }

Collection Classes

Jia: 8.2, Skansholm: 17

Se även Suns tutorial om Collections

Objectorienterad programmering Sida 11

Collection classes Sven-Olof Nyström

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

(4)

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)

Objectorienterad programmering Sida 13

Collection classes Sven-Olof Nyström

Repetition: Interface En slags ’lättviktsklasser’.

Beskriver en uppsättning metoder.

Man säger att en klass implementerar ett interface.

Collections, ett första exempel

• Simple.java

• Simple142.java

Samma exempel i gamla Java

Objectorienterad programmering Sida 15

Collection classes Sven-Olof Nyström

Interface för samlingar

Set List SortedMap Collection Map

SortedSet

(5)

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

Objectorienterad programmering Sida 17

Collection classes Sven-Olof Nyström

Collection

En samling element

operationer för att lägga till och ta bort element Konvention:

Varje klassK som implementerar Collection har en konstruktorK(Collection c)

(som tar en godtycklig samling)

Därmed kan man lätt konvertera mellan olika samlingar

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 19

Collection classes Sven-Olof Nyström

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()

(6)

Iteratorer

Tre operationer på Iterator<E>

boolean hasNext();

E next();

void remove();

Objectorienterad programmering Sida 21

Collection classes Sven-Olof Nyström

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)

Denna notation kan även användas för iteration över arrayer.

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);

} }

Objectorienterad programmering Sida 23

Collection classes Sven-Olof Nyström

Körexempel

$ javac A.java

$ java A en gång är ingen gång [en, gång, är, ingen, gång]

$

(7)

Exempel: LinkedList Program B.java

Exempel (med for-loopar) Program C.java

Objectorienterad programmering Sida 25

Collection classes Sven-Olof Nyström

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)

Exempel: HashSet Program: D.java

Objectorienterad programmering Sida 27

Collection classes Sven-Olof Nyström

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)

(8)

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

Objectorienterad programmering Sida 29

Collection classes Sven-Olof Nyström

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);

} }

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 31

Collection classes Sven-Olof Nyström

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.

(9)

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.

Objectorienterad programmering Sida 33

Collection classes Sven-Olof Nyström

Exempel: Svensk sortering class F {

public static void main(String args[]) {

Collator collator =

Collator.getInstance(new Locale("sv", "se"));

SortedSet l = new TreeSet(collator);

[...]

}}

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]

$

Objectorienterad programmering Sida 35

Collection classes Sven-Olof Nyström

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)

(10)

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.

Objectorienterad programmering Sida 37

Collection classes Sven-Olof Nyström

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<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 39

Collection classes Sven-Olof Nyström

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)

(11)

Hitta duplicerade ord med HashSet Program: FindDups.java, FindDups2.java

Objectorienterad programmering Sida 41

Collection classes Sven-Olof Nyström

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();

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?)

Objectorienterad programmering Sida 43

Collection classes Sven-Olof Nyström

Räkna antal förekomster Program: Freq.java, Freq2.java

(12)

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

Objectorienterad programmering Sida 45

Collection classes Sven-Olof Nyström

• StringBuffer append (boolean b)

• char charAt(int i)

• void setCharAt(int i, char c)

• String toString()

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 47

Collection classes Sven-Olof Nyström

• 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.

References

Related documents

Förslag gällande förbud mot användning av växtskyddsmedel inom vissa områden och miljösanktionsavgift för överträdelse av förbuden. Konsumentverket har

handläggningen har också föredragande verksamhetsanalytiker Peter Vikström

31 personer visade på ARHQ-vux att det fanns risk för dyslexi medan dessa 31 personer enligt DUVAN inte hade någon problematik och man kan då tänka sig att det ligger ett

Målet är att locka Tyresöborna tillbaka till förorten eller att det i alla fall ska finnas at- traktiva boenden för dem att flytta tillbaka till efter att de som unga vuxna

Resultatet visar att personalchefernas erfarenhet av funktionshindrade på arbetsplatsen är en viktig komponent för att våga anställa fler medarbetare med

12 http://www.karinboye.se/verk/ljudinspelningar/onskan.mp3.. 13 stycken jag valde i början, bytte betydelse för mig efter att ha läst boken i sin helhet. Det har vidgat mitt

Höjdmeter: 570 m , Vandringstid: 3,5 h Alternativ: Vandring till toppen av Chopok Mer avancerad vandring: längs åsen till Ste- fanikova alpstuga och tillbaka till linbanan

According to a recent review (130) engagement in physical activity that results in improved cardiorespiratory endurance contributes to reductions in health