Collectionklasser Klassifikation og anvendelse
dIntProg, F08Collectionklasser.2 Samlinger af objekter Objektreferencer –for at holde fast i et objekt skal der bruges en objektreference (en variabel) –for at holde fast i objekter skal der bruges objektreferencer... Collections –en særlig slags objekter der kan opbevare (referencer til) objekter java.util –en pakke der bl.a. indeholder klasserne i Javas såkaldte collection framework
dIntProg, F08Collectionklasser.3 Containerklasser i Java Containerklasser –antag at man skal repræsen- tere et kartotek over studeren- de på dette kursus –der er behov for en klasse der kan modellere begrebet stu- dent –der er også behov for et sær- ligt objekt der kan opbevare student-objekterne –i Java findes en række forskel- lige collectionklasser –colectionklasserne er organi- seret i et klassifikationshierarki HashSet impl Set TreeSet impl SortedSet ArrayList impl List LinkedList impl List HashMap impl Map TreeMap impl SortedMap Interfaces (specifikation) Klasser (implementation) HVADHVORDANHVADHVORDAN
dIntProg, F08Collectionklasser.4 Forskellige containere Collection –samlebegreb for Set og List Set –uordnet samling objekter SortedSet –sorteret samling objekter List –ordnet samling objekter (rækkefølgen har betydning) –0, 1,..., size()-1 Map –uordnet mængde af par SortedMap –sorteret mængde af par { 4, 5, 1, 7 } { 7, 5, 1, 4 } { 1, 4, 5, 7 } [ 4, 5, 1, 7 ] [ 7, 5, 1, 4 ] { (”gigantisk”, ”gigantic”), (”abe”, ”monkey”) } { (”abe”, ”monkey”), (”gigantisk”, ”gigantic”) }
dIntProg, F08Collectionklasser.5 List, et forkert eksempel List l= new ArrayList (); l.add(4); l.add(5); l.add(1); l.add(7); l: size() =
dIntProg, F08Collectionklasser.6 Collection List –generelt interface for lister (sekvenser) af objekter af typen E public interface List { boolean add(E o); void add(int index, E element); E get(int index); boolean contains (Object o); boolean isEmpty(); Iterator iterator(); boolean remove(Object o); int size();... } Se JavaDoc...
dIntProg, F08Collectionklasser.7 Eksempel: Liste af personer public void testMethod1() { Person tp; List l= new ArrayList (); tp= new Person( "Bruce Springsteen", 57 ); l.add(tp); tp= new Person( "Paul McCartney ", 65 ); l.add(tp); tp= new Person( "Michael Caspersen", 46 ); l.add(tp); }
dIntProg, F08Collectionklasser.8 Objektmodel for personeksempel l: ArrayList size() = 3 age: name: ”Bruce Springsteen” 57 age: name: ”Paul McCartney” 65 age: name: ”Michael Caspersen” 46
dIntProg, F08Collectionklasser.9 Gennemløb med udvidet for-løkke public void testMethod1() { Person tp; List l= new ArrayList (); tp= new Person( "Bruce Springsteen", 57 ); l.add(tp); tp= new Person( "Paul McCartney ", 65 ); l.add(tp); tp= new Person( "Michael Caspersen", 46 ); l.add(tp); // for alle personer p i l... for ( Person p : l ) { if ( p.isOld() ) { System.out.println(p); }
dIntProg, F08Collectionklasser.10 Wrapperklasser og autoboxing Javas containerklasser kan kun indeholde objekter Hvad gør man hvis man har brug for en liste af værdier fra en primitiv type, f.eks. int? Wrapperklasser –int Integer –double Double –boolean Boolean –... List l; l= new ArrayList (); l.add(7); int x= l.get(0); Integerint autounboxing autoboxing l: 7 x: 7 intInteger ArrayList
dIntProg, F08Collectionklasser.11 List, det rigtige eksempel List l= new ArrayList (); l.add(4); l.add(5); l.add(1); l.add(7); l: size() =
dIntProg, F08Collectionklasser.12 Eksempel: gennemsnitsalder /** * return the average age of the people in list persons */ private int averageAge(List persons) { ? } Specifikation (hvad)
dIntProg, F08Collectionklasser.13 Implementation (1) /** * return the average age of the people in list persons */ private int averageAge(List persons) { if ( persons.isEmpty() ){ // case 1 } else { // case 2 } Implementation (hvordan)
dIntProg, F08Collectionklasser.14 Implementation (2) /** * return the average age of the people in persons */ private int averageAge(List persons) { if ( persons.size() == 0 ){ return 0; } else { return ageSum(persons) / persons.size(); } /** * return the sum of the age of the people in persons */ private int ageSum(List persons) { ? }
dIntProg, F08Collectionklasser.15 Implementation (3) /** * return the sum of the age of the people in persons */ private int ageSum(List persons) { int s= 0; // accumulate the sum of... in variable s return s; }
dIntProg, F08Collectionklasser.16 Implementation (4) /** * return the sum of the age of the people in persons */ private int ageSum(List persons) { int s= 0; for (Person p : persons) { s= s + p.getAge(); } return s; }