programmera.net -> java -> normal för utskrift | info@programmera.net |
Samlingar
1. Gränssnitten 2. Collection 3. Iterator 4. Set 5. SortedSet 6. List 7. ListIterator 8. Map 9. Map.Entry 10. SortedMap 11. Collections |
1. Gränssnitten
Javas sätt att gruppera objekt har en anknytning till matematiska begrepp. Av varje matematiskt begrepp har man gjort ett gränssnitt. Genom att bara använda metoderna som definieras i gränssnittet kan man lätt byta bort samlingsklassen då den blir omodern. I följande lista tas de grundläggande begreppen och gränssnitten upp:
Begrepp Gränssnitt Klasser Beskrivning Samling Collection - En grupp objekt. Lista List ArrayList, LinkedList En grupp objekt som har en position. Mängd Set HashSet En grupp unika objekt. Sorterad Mängd SortedSet TreeSet En grupp unika objekt som är sorterade. Bokstäverna A till Ö är ett exempel på en sorterad mängd. Karta Map HashMap En grupp objekt där varje objekt har en unik nyckel. Sorterad Karta SortedMap TreeMap En grupp objekt där varje objekt har en unik nyckel, och där nycklarna är sorterade.
De klasser som listas i tabellen ovan är bara exempel på klasser som implementerar gränssnintten. Hirarkin bland gränssnitten är som följer:
Collection
+--List
+--Set
+--SortedSet
Map
+--SortedMap
2. Collection
Detta gränssnitt kan implementeras utan att man egentligen implementerar alla metoder. Om Obligatorisk i tabellen nedan är nej, kan metoden implementeras genom att den kastar UnsupportedOperationException (runtime, behöver ingen try-sats). Anledningen till detta förfarande är att det ska gå att skapa samlingsklasser utan metoder för att ändra innehållet i samlingen, men som ändå implementerar gränssnittet. Nedan listas gränssnittets metoder:
Metod Returtyp Obligatorisk Beskrivning add(Obj) boolean Nej Lägger till ett element Obj. addAll(Col) boolean Nej Lägger till alla element från samlingen Col. remove(Obj) boolean Nej Tar bort elementet Obj (ett element tas bort om flera finns). removeAll(Col) boolean Nej Tar bort alla element i samlingen Col. retainAll(Col) boolean Nej Tar bort alla element utom de i samlingen Col. clear() void Nej Tar bort alla element. contains(Obj) boolean Ja Kollar om ett element Obj finns i samlingen. containsAll(Col) boolean Ja Kollar om alla element i samlingen Col finns i samlingen. equals(Col) boolean Ja Kollar om samlingen Col är har samma storlek och innehåller samma element som samlingen. hashCode() int Ja Genenrerar en hashkod för samlingen. Hashkoden är summan av alla elementens hashkoder. isEmpty() boolean Ja Returnerar true om samlingen är tom. iterator() Iterator Ja Returnerar en Iterator för samlingen. size() int Ja Returnerar antal element. toArray() Object[] Ja Returnerar en array med alla samlingens element. toArray(Obj[]) Object[] Ja Som toArray() men metoden försöker lagra elementen i arrayen Obj[]. Om Obj[] är för liten returneras en ny array. Kastar ArrayStoreException om något element inte är av klassen Obj.
3. Iterator
Med detta gränssnitt kan man bekvämt stega igenom en samling. Eftersom en samling inte är ordnad på något sätt kan detta vara det enda sättet att få ut samtliga element. En Iterator har följande metoder:
Metod Returtyp Beskrivning hasNext() boolean Returnerar true om det finns ännu ett element. next() Object Returnerar nästa element. remove() void Tar bort senaste element som returnerats med next().
Ett exempel på hur Iterator används är:
Vi kör programmet:
import java.util.*;
class TestIterator{
public static void main(String[] args){
ArrayList al=new ArrayList();
al.add("Hejsan");
al.add("Alla");
al.add("Glada");
Iterator i=al.iterator();
while(i.hasNext()){
String e=(String) i.next();
System.out.println("s="+e);
}
}
}
Om en annan tråd håller på att ändra i samlingen samtidigt som iteratorn stegar igenom den kastas ConcurrentModificatoinException (runtime).
[olle@dev1]$ java TestIterator
s=Hejsan
s=Alla
s=Glada
4. Set
Gränssnittet Set ärver av Collection. I ett Set får ett element ej läggas till mer än en gång. Om man försöker lägga till ett element som redan finns händer ingenting. Gränssnittet har samma metoder som Collection. Exempel på en klass som implementerar Set är:
Vi testar denna samlingsklass:
Elementen kan komma i viken ordning som helst:
import java.util.*;
class TestHashSet{
public static void main(String[] args){
HashSet hs=new HashSet();
hs.add("Hejsan");
hs.add("Alla");
hs.add("Glada");
System.out.println(hs);
}
}
[olle@dev1]$ java TestHashSet
[Glada, Hejsan, Alla]
5. SortedSet
Detta gränssnitt ärver av Set. För detta gränssnitt gäller att mängden dessutom ska vara sorterad. Ett exempel på en sorterad mängd ur verkliga livet är bokstäverna A till Ö. De är alla unika och har inbördes ordning. Element som ska lagras i SortedSet måste implementera gränssnittet Comparable, dvs. ha metoden compareTo(Obj).
Metod Returtyp Obligatorisk Beskrivning first() Object Ja Returnerar det första elementet. last() Object Ja Returnerar det sista elementet. headSet(to) SortedSet Ja Returnerar de element mindre än to. subSet(from,to) SortedSet Ja Returnerar de element större eller lika med elementet from, och mindre än to. tailSet(from) SortedSet Ja Returnerar de elementet större eller lika med from.
Den enda klass som implementerar SortedSet är:
Vi testar denna samlingsklass:
Och vi får en sorterad utskrift:
import java.util.*;
class TestTreeSet{
public static void main(String[] args){
TreeSet s=new TreeSet();
s.add("Hejsan");
s.add("Alla");
s.add("Glada");
System.out.println(s);
}
}
[olle@dev1]$ java TestTreeSet
[Alla, Glada, Hejsan]
6. List
Detta gränssnitt ärver från Collection. För detta gränssnitt gäller att elementen ska vara ordnade i en numerisk ordning. Gränssnittet innehåller förutom metoderna i Collection några nya, som alla har med ordningen att göra:
Metod Returtyp Obligatorisk Beskrivning add(i,Obj) void Nej Lägger till elementet Obj på index i. addAll(i,Col) boolean Nej Lägger till samlingen Col på index i. set(i,Obj) Object Nej Ersätter elementet på index i med Obj. Returnerar elementet tidigare på index i. remove(i) boolean Nej Tar bort elementet på index i. get(i) Object Ja Returnerar elementet på index i. indexOf(Obj) int Ja Returnerar index av första förekomsten av elementet Obj. lastIndexOf(Obj) int Ja Returnerar index av sista förekomsten av elementet Obj. listIterator() ListIterator Ja Returnerar en ListeIterator. listIterator(i) ListIterator Ja Returnerar en ListIterator från index i. subList(from, to) List Ja Returnerar en del av Listan från och med index from till och med elementet innan index to.
Exempel på klasser som implementerar List är:
7. ListIterator
Denna gränssnitt ärver av Iterator. Med ListIterator kan man även anropa följande metoder:
Metod Returtyp Obligatorisk Beskrivning add(Obj) void Nej Lägger till elementet Obj före det element som skulle ha returneras av next(). remove() void Nej Tar bort elementet som senast returnerades av next() eller previous(). set(Obj) void Nej Ersätter elementet som senast returnerades av next() eller previous() med Obj. previous() Object Ja Returnerar föregående element. hasPrevious() boolean Ja Returnerar true om det finns ett föregående element. nextIndex() int Ja Returnerar nästa elements index. previousIndex() int Ja Returnerar föregående elements index.
8. Map
Detta gränssnitt är inte en subklass till Collection, utan definierar sina egna metoder. En karta är en samling nyckel/värde-par där nycklarna måste vara unika, men värdena kan vara dubblerade. Både nyckeln och värdet är av typen Object, kan alltså vara vad som helst. Följande metoder finns:
Metod Returtyp Obligatorisk Beskrivning put(keyObj,valObj) Object Nej Lägger till nyckel/värde-paret. Returnerar tidigare värde knutet till nyckeln, eller null om inget par finns. putAll(Map) void Nej Lägger till kartan Map. remove(keyObj) Object Nej Tar bort nyckel/värde paret med nyckel keyObj och returnerar värdet. clear() void Nej Tar bort allt. get(keyObj) Object Ja Returnerar värdet som hör till nyckeln keyObj. containsKey(keyObj) boolean Ja Returnerar true om nyckeln keyObj finns. containsValue(valObj) boolean Ja Returnerar true om värdet valObj finns en eller fler gånger. isEmpty() boolean Ja Returnerar true om kartan är tom. equals(Map) boolean Ja Returnerar true om kartan Map har samma storlek som kartan och innehåller samma nyckel/värde-par. size() int Ja Returnerar antalet nyckel/värde-par. hashCode() int Ja Returnerar hashkoden för kartan. Hashkoden är summan av hashkoderna för alla nyckel/värde-par. keySet() Set Ja Returnerar mängden av alla nycklar. values() Collection Ja Returnerar samlingen av alla värden. entrySet() Set Ja Returnerar en mängd av alla nyckel/värde-par. Varje par är av typen Map.Entry.
Här är exempel på klasser som implementerar gränssnittet:
9. Map.Entry
Det enda sättet att komma åt ett Map.Entry-objekt är att anropa metoden Map.entrySet() som returnerar en samling av sådana objekt. Du kan sedan stega igenom samlingen genom att begära en Iterator med metoden iterator(). Gränssnittet Map.Entry innehåller en del praktiska metoder för ett nyckel/värde-par:
Metod Returtyp Obligatorisk Beskrivning setValue(valObj) Object Nej Ersätter värdet med valObj. getKey() Object Ja Returnerar nyckeln. getValue() Object Ja Returnerar värdet. equals(eObj) boolean Ja Returnerar true om eObj är samma nyckel/värde-par. hashCode() int Ja Returnerar nyckel/värde-parets hashkod.
10. SortedMap
Detta gränssnitt ärver från Map. I en SortedMap ska nycklarna vara sorterade i en stigande ordning. En sorterad karta från verkliga livet är ett uppslagsverk, där man slår upp ett sorterat nyckelord, och får en beskrivning. På samma sätt som med SortedSet ska nycklarna implementera gränssnittet Comparable, d.v.s. ha metoden compareTo(Obj). Ofta räcker det med att använda String som nyckel, så då behöver man inte fundera mer på det. SortedMap utökar Map med några nya metoder:
Metod Returtyp Obligatorisk Beskrivning firstKey() Object Ja Returnerar den lägsta nyckeln. lastKey() Object Ja Returnerar den högsta nyckeln. headMap(toKey) SortedMap Ja Returnerar den del av kartan där alla nycklar är mindre än keyObj. subMap(fromKey,toKey) SortedMap Ja Returnerar den del av kartan där alla nycklar är mindre än toKey och större än eller lika med fromKey. tailMap(fromKey) SortedMap Ja Returnerar den del av kartan där alla nycklar är större än eller lika med fromKey. comparator() Comparator Ja Returnerar den Comparator som är associerad med kartan, eller null om nycklarna implementerar Comparable.
Den enda klass som implementerar detta gränssnitt är:
11. Collections
Det finns en klass som står lite utanför de övriga, i det att den inte lagrar några element utan opererar på samlingar. Klassen har det något förvirrande namnet Collections. Denna klass implementerar inte gränssnittet Collection. Klassen har bara statiska metoder och ingen konstruktor. Nedan listas några av klassens metoder:
Metod Returtyp Statisk Beskrivning sort(List) void Ja Sorterar listan då alla elementen implementerar Comparable. sort(List, Comparator) void Ja Sorterar listan med hjälp av Comparator. shuffle(List) void Ja Blandar listan då alla element implementerar Comparable. shuffle(List, Comparator) void Ja Blandar listan med hjälp av Comparator. max(Col) Object Ja Returnerar det största elementet då alla elementen implementerar Comparable. max(Col, Comparator) Object Ja Returnerar det största elementet med hjälp av Comparator. min(Col) Object Ja Returnerar det mista elementet då alla elementen implementerar Comparable. mim(Col, Comparator) Object Ja Returnerar det minsta elementet med hjälp av Comparator.