• No results found

Samlingar Collection classes

N/A
N/A
Protected

Academic year: 2022

Share "Samlingar Collection classes"

Copied!
12
0
0

Loading.... (view fulltext now)

Full text

(1)

Samlingar—Collection classes

Sven-Olof Nyström Uppsala Universitet

17 juni 2005

Skansholm: Kapitel 9, 19

Se även Suns tutorial om Collections

1

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

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)

3

Samlingar (forts)

• 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

(2)

Repetition: Interface En slags ’lättviktsklasser’.

Beskriver en uppsättning metoder.

Man säger att en klass implementerar ett interface.

5

Collections, ett första exempel

• Simple.java

• Simple142.java

Samma exempel i gamla Java

Interface för samlingar

Set List SortedMap Collection Map

SortedSet

7

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

(3)

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

9

Operationer på Collection <E>

int size()

boolean isEmpty()

boolean contains(Object element) boolean remove(Object element) boolean add(E element)

Iterator<E> iterator()

add och remove returnerar true om samlingen ändras till följd av operationen.

Ett objekt av klassen iterator (en iterator) är ett slags index eller pekare som används om man vill gå igenom alla element i en samling.

Operationer på många element boolean containsAll(Collection<?> c) boolean addAll(Collection<?> c) boolean removeAll(Collection<E> c)

containsAll testar om alla element i en viss samling innehåller alla element i en annan samling

addAll adderar alla element ur en samling till en annan removeAll tar bort de element som ingår i den andra samlingen

11

Operationer på många element (forts) boolean retainAll(Collection<?> c) void clear()

E[] toArray()

retainAll sparar endast de element som ingår i den andra samlingen

clear tar bort alla element

toArray Skapar en array med samma element

(4)

Iteratorer

Tre operationer på Iterator<E>

boolean hasNext();

E next();

void remove();

13

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

} }

15

Körexempel

$ javac A.java

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

$

(5)

Exempel: LinkedList Program B.java

17

Exempel (med for-loopar) Program C.java

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)

19

Exempel: HashSet Program: D.java

(6)

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)

21

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

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

} }

23

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, ö]

$

(7)

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.

25

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.

Exempel: Svensk sortering import java.util.*;

import java.text.*;

class F {

public static void main(String args[]) { Collator collator =

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

SortedSet l = new TreeSet(collator);

for (int i=0; i<args.length; i++) l.add(args[i]);

System.out.println(l);

}}

27

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]

$

(8)

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 — returnerar element vid viss position

• set — skriver över tidigare element vid viss position

29

List — operationer ur Collection (forts) E add(int index, E element)

int indexOf(E element) ListIterator listIterator()

• add — gör insättning vid viss position

• indexOf — position för första förekomst av elementet,

−1om elementet inte finns

Gränssnittet List (forts)

ListIterator är en utökning av gränssnittet Iterator där man kan

• traversera framåt och bakåt

• modifiera sekvensen vid traversering

• plocka fram position för olika element

31

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.

(9)

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>

33

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

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)

35

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

(10)

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

37

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

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

39

Kort mellanspel: Klassen StringBuffer

Exempel:

x = "a" + 4 + "c"

kan även skrivas

x = new StringBuffer().append("a").append(4).append("c").toString() Den senare satsen skapar en ny (tom) stringbuffer, tar

strängrepresentationen av varje operand i tur och ordning och konkatenerar till buffern.

Vinst: Vi undviker att allokera ett antal temporära strängar.

(11)

Operationer på StringBuffer

• Ungefär som String, men tillåter uppdatering

• StringBuffer(String s)

• StringBuffer(int l)

en buffer av längd l, som från början är tom

• StringBuffer append (boolean b)

(Samma för alla andra primitiva datatyper)

41

StringBuffer—Operationer (forts)

• StringBuffer insert (int i, boolean b) skjuter in stängen vid position i

• char charAt(int i)

• void setCharAt(int i, char c)

Viktigaste operationer: append och insert (tar alla typer)

StringBuffer: Exempel

Anta att z en strängbuffer med innehåll start".

efter metodanropet z.append(le") innehåller z strängen startle".

Om vi i stället gör metodanropet z.insert(4, le") kommer z att innehålla starlet".

Varje strängbuffer har en viss kapacitet. Om kapaciteten överskrids, allokeras en större intern array.

43

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.

(12)

Sammanfattning

• Javas standardbibliotek definierar ett antal datastrukturer—collections

• Tack vare interfacebegreppet kan vi använda de olika samlingarna på ett likformigt sätt

• Kraftfullt, och egentligen inte så komplicerat

• För att använda dem effektivt krävs nog att man tänker om en smula

45

References

Related documents

Material 1 M kopparsulfat, 1 M zinksulfat, 1 M Kaliumklorid Utförande Bygg ett galvaniskt element enligt figuren2. Koppla

Igenom att göra dessa förändringar och tillägg på denna tomt så kommer den att kunna används mer och bättre utav alla boende i området, min tanke är att detta kommer att bli

Den grupp som spelade den abstrakta versionen utan återkopplingar till det förkonstruerade narrativet gjorde i sitt återberättande fler referenser till det

Att som i exemplet ovan best¨ amma den st¨ orsta gemensamma delaren till tv˚ a tal genom att f¨ orst best¨ amma alla delarna till de b˚ ada talen verkar inte vara n˚ agon

Alla element som sätts in i en sorterad mängd måste antingen implementera gränssnittet Comparable (eller accepteras av en given Comparator).. Kort

$ 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

ü Anod: Anoden utgörs av den metall som lättast oxideras (avger elektroner) och bildar joner.. Anoden har ett elektronöverskott jämfört

§ Hos galvaniska element med metallelektroder (det finns andra varianter också) så är det positiva joner i elektrolytlösningen runt katoden som tar emot de elektroner som