Presentation laddar. Vänta.

Presentation laddar. Vänta.

Algoritmer och datastrukturer

Liknande presentationer


En presentation över ämnet: "Algoritmer och datastrukturer"— Presentationens avskrift:

1 Algoritmer och datastrukturer
Algoritmer och datastrukturer Föreläsning 3 Generiska klasser och metoder (Weiss kap , Skansholm 17.1) Generiska <klasser> <Generiska> klassmetoder Råa typer Typbegränsningsuttryck Jämförelseklasser ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

2 Definition av generisk klass
Algoritmer och datastrukturer Definition av generisk klass public class klassnamn <typuttryck1, typuttryck2, ...> { // metoder och variabler }; Typvariablerna i typuttrycken får användas för att sätta typ på variabler i konstruktorer och metoder: parametrar, lokala variabler, returtyper (dock ej i statiska klassmetoder) En generisk klass kan ha flera olika typvariabler typvariabelnamnen kan väljas fritt (men inled med stor bokstav) Även interface kan vara generiska ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

3 Instansiering av generisk klass
Algoritmer och datastrukturer Instansiering av generisk klass Klassnamn <typ1, typ2, ...> objektnamn; Vilka typer en generisk klass kan instansieras med beror på hur typerna används i klassen ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

4 Exempel: Minnescell för heltal
Algoritmer och datastrukturer Exempel: Minnescell för heltal public class IntMemoryCell { private Integer value = null; public void store(Integer value) { this.value = value; } public Integer getValue() { return value; ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

5 Exempel: Minnescell för flyttal
Algoritmer och datastrukturer Exempel: Minnescell för flyttal public class FloatMemoryCell { private Float value = null; public void store(Float value) { this.value = value; } public Float getValue() { return value; } … ∞ ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

6 Exempel: Generell (generisk) minesscell
Algoritmer och datastrukturer Exempel: Generell (generisk) minesscell public class MemoryCell<T> { private T value = null; public void store(T value) { this.value = value; } public T getValue() { return value; Dataoberoende ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

7 Exempel: Instansiering av generisk minesscell
Algoritmer och datastrukturer Exempel: Instansiering av generisk minesscell MemoryCell<Integer> a = new MemoryCell<Integer>(); a.store(123); Integer i = a.getValue(); MemoryCell<String> b = new MemoryCell<String>(); b.store(”Generisk”); String s = b.getValue(); ... och varför inte MemoryCell<MemoryCell<String>> c = new MemoryCell<MemoryCell<String>> (); c.store(b); MemoryCell<String>x = c.getValue(); ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

8 Generiska klassmetoder
Algoritmer och datastrukturer Generiska klassmetoder synlighetsmodifierare static <T1,T2,...> returtyp metodnamn parameterlista { ... } T1,T2,... kan vara typvariabler eller typuttryck med variabler och wild-cards. Typvariablerna får användas överallt i metoden men inte som elementtyper i fält. En klassmetod får ej använda klassens generiska typparametrar utan måste sina ha egna. ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

9 Generiska klassmetoder
Algoritmer och datastrukturer Generiska klassmetoder Exempel public static <T> T namn(){…} public static <T> List<T> namn(){…} Typparameter Returtyp Metodnamn ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

10 Generiska klassmetoder
Algoritmer och datastrukturer Exempel: En (?) metod som byter plats på två element i en lista class ListOps { public static void swap(List<Integer> l,int i,int j){ Integer temp = l.get(i); l.set(i,l.get(j)); l.set(j,temp); } public static void swap(List<Float> l,int i,int j){ Float temp = l.get(i); } … ∞ ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

11 Generiska klassmetoder
Algoritmer och datastrukturer Generiska klassmetoder Exempel: En metod som byter plats på två element i en lista class ListOps { public static <T> void swap(List<T> l,int i,int j) { T temp = l.get(i); l.set(i,l.get(j)); l.set(j,temp); } Anrop: List<String> sl = new ArrayList<>(); ... ListOps.swap(sl,2,37); eller ListOps.<String>swap(sl,2,37); Notera <>-notationen ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

12 Typradering och råa typer
Algoritmer och datastrukturer Typradering och råa typer Bakåtkompatibilitet med äldre java-versioner Typvariablerna raderas av kompilatorn Kvar blir ickegeneriska ”råa” typer Standardklasser som är generiska kan användas utan typvariabler I java betyder List ung. samma sak som List<Object> ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

13 Generiska typer och subtyper
Algoritmer och datastrukturer Generiska typer och subtyper Är ArrayList<A> en subtyp till List<A>? Ja Får en metod med signaturen f(List<A>) anropas med ArrayList<A> som argument? Ja Om B är en subtyp till A Är då List<B> en subtyp till List<A>? Nej - med List<B> som argument? Nej - med ArrayList<B> som argument? Nej ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

14 Subtypsrelationer - exempel
Algoritmer och datastrukturer Subtypsrelationer - exempel Ex. public class Rectangle { private int width, height; public Rectangle(int width,int height) { this.width = width; this.height = height; } public int getArea() { return width*height; } public int getWidth() { return width; } public int getHeight() { return height; } public boolean equals(Object other) { ... } ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

15 Algoritmer och datastrukturer
Subtypsrelationer Ex. public class Square extends Rectangle { public Square(int side) { super(side,side); } public int getSide() { return getWidth(); Rectangle Square ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

16 Algoritmer och datastrukturer
Subtypsrelationer public static void f1(Rectangle x) f1(new Rectangle()); // OK f1(new Square()); // OK Rectangle Square ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

17 Algoritmer och datastrukturer
Subtypsrelationer public static void f2(List<Rectangle> x) f2(new ArrayList<Rectangle>()); //OK f2(new LinkedList<Rectangle>()); // OK f2(new ArrayList<Square>()); // TYPFEL! f2(new LinkedList<Square>()); // TYPFEL! Rectangle Square ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

18 Typbegränsningsuttryck
Algoritmer och datastrukturer Typbegränsningsuttryck wild card ? matchas av vilken typ som helst <? extends T > matchas av T och alla subtyper till T <? super T > matchas av T och alla supertyper till T Ex. Comparator<? super T> Varför <? Super …> i TreeSets konstruktor? ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

19 Exempel 1: Typbegränsning
Algoritmer och datastrukturer Exempel 1: Typbegränsning public static void f3(List<? extends Rectangle> x) f3(new ArrayList< Rectangle >()); // OK f3(new LinkedList< Rectangle >()); // OK f3(new ArrayList< Square >()); // OK f3(new LinkedList< Square >()); // OK Rectangle Square “? extends T” matchas av subtyper till T ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

20 Exempel 2: Typbegränsning
Algoritmer och datastrukturer Exempel 2: Typbegränsning Summering av lista med valfri numerisk elementtyp public static double sumList(List<? extends Number> numberList) { double sum = 0.0d; for ( Number n : numberList ) sum += n.doubleValue(); return sum; } ArrayList<Long> ll; ... double d = sumList(ll); LinkedList<Float> lf; ... d = sumList(lf); ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

21 Tillämpningar av begränsningsuttryck
Algoritmer och datastrukturer Tillämpningar av begränsningsuttryck Ofta är det lämpligt att definiera likhets- och relationsoperator för basklassen i en klasshierarki, och sedan låta dessa ärvas till subklasserna. Ex. equals, compareTo, compare Typbegränsningsuttryck gör detta möjligt även i kombination med generiska klasser. ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

22 Algoritmer och datastrukturer
Jämförelseklasser public interface Comparable<T> { int compareTo(T other); } public interface Comparator<T> { int compare(T lhs,T rhs); Instanser av klasser som implementerar detta gränssnitt är jämförbara med varandra < -1 == 0 > 1 Object för bakåtkompatibilitet Comparable i java.lang Det är Comparator man skickar runt som parametrar till metoder (equals avgör om två comparatorer är lika) Instanser av klasser som implementerar detta gränssnitt kan jämföra objekt av typ T ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

23 Algoritmer och datastrukturer
java.lang.Comparable public MyClass implements Comparable<MyClass> { public int compareTo(MyClass x) { compares MyClass objects } + övr. metoder } MyClass obj1,obj2; ... if ( obj1.compareTo(obj2) > 0 ) ... Låser jämförelsemetoden till klassen. Ex. String har compareTo ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

24 Algoritmer och datastrukturer
java.lang.Comparable public class Person Implements Comparable< > { private String pnr; ... public int compareTo(Person other) { return pnr.compareTo(other.pnr); } // konstruktor och andra metoder är utelämnade Ex. Ordna Person- objekt i person- nummerordning Person Delegera jämförelsen till strängklassen (for example). ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

25 Algoritmer och datastrukturer
java.util.Comparator public YourClass { public void yourMethod( ..., Comparator<some type> comp ) { ... if ( comp.compare(x,y) == ... ) ... } + övr. metoder Mer flexibel Användaren skickar med ett jämförelseobjekt i metodanropet ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

26 Algoritmer och datastrukturer
StringComparator public class StringComparator implements Comparator<String> { public int compare(String s1,String s2) { return s1.compareTo(s2); } YourClass obj; ... obj.yourMethod(...,new StringComparator()); ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

27 Ex. Storleksjämförelse av figurer
Algoritmer och datastrukturer Ex. Storleksjämförelse av figurer Ex. public class RectangleComparator implements Comparator<Rectangle> { public int compare(Rectangle a,Rectangle b) { if ( a.getArea() < b.getArea() ) return -1; else if ( a.getArea() == b.getArea() ) return 0; else return 1; } Detta är bara ett bland flera möjliga sätt att jämföra rektanglar! ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

28 Jämförelser och subtyper
Algoritmer och datastrukturer Jämförelser och subtyper Ex. RectangleComparator rcomp = new RectangleComparator(); Rectangle r1 = new Rectangle(5,4); r2 = new Rectangle(3,4); Square sq1 = new Square(12), sq2 = new Square(37); rcomp.compare(r1,r2); // 1 rcomp.compare(sq1,sq2); // -1 Tillåtet eftersom en kvadrat är en rektangel ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

29 En generisk mängdklass (forts. från förel. 1)
Algoritmer och datastrukturer, förel. 1 En generisk mängdklass (forts. från förel. 1) public interface GenericSet<T> { void add( T x ); boolean contains( T x ); } Generalisera mängdklassen. Första ”naiva” försöket ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

30 En generisk ordnad mängdklass
Algoritmer och datastrukturer En generisk ordnad mängdklass public class GenericOrderedSet<T> implements GenericSet<T> { public GenericOrderedSet(Comparator<T> comp) public void add(T x) public boolean contains(T x) public int size() public T get(int i) } … mindre bra men vi återkommer till det! Returnerar det i:te elementet i storleksordning ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

31 Algoritmer och datastrukturer
Mängder av rektanglar Ex. RectangleComparator rcomp = new RectangleComparator(); GenericOrderedSet<Rectangle> rectSet = new GenericOrderedSet<Rectangle>(rcomp); rectSet.add(new Rectangle(5,4)); // störst rectSet.add(new Rectangle(2,3)); // minst rectSet.add(new Rectangle(3,4)); // mellan (rectSet.get(2)).equals(new Rectangle(5,4)) // true Rekapitulera exemplet från slutet av förel. 1 ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

32 Algoritmer och datastrukturer
Mängder av kvadrater? RectangleComparator rcomp = new RectangleComparator(); GenericOrderedSet<Square> squareSet = new GenericOrderedSet<Square>(rcomp); // konstruktorn GenericOrderedSet(Comparator<T> comp) TYPFEL! rcomp borde ha typen Comparator<Square> men har typen Comparator<Rectangle> ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

33 Typbegränsningsuttrycket <? super T>
Algoritmer och datastrukturer Typbegränsningsuttrycket <? super T> public class GenericOrderedSet<T> implements GenericSet<T> { private static final int DEFAULT_CAPACITY = 256; private static final int SIZE_INCREMENT = 128; private int capacity = DEFAULT_CAPACITY; // Array capacity private int size = 0; // Number of distinct elements private T[] array; private Comparator<? super T> comp; // konstruktor public GenericOrderedSet(Comparator<? super T> comp) {…} public void add(T x) { ... } public boolean contains(T x) { ... } public T get(int i) { ... } } ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

34 GenericOrderedSet.contains
Algoritmer och datastrukturer GenericOrderedSet.contains // Constructor public GenericOrderedSet(Comparator<? super T> comp) { this.comp = comp; array = (T[])new Object[capacity]; } public boolean contains(T x) for ( int i = 0; i < size; i++ ) if ( array[i].equals(x) ) return true; return false; ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

35 Algoritmer och datastrukturer
GenericOrderedSet.add public void add( T x ) { if ( this.contains(x) return; if ( size == capacity ) { // buffer full? T[] old = array; // handle to old array // allocate a twice as big array capacity += SIZE_INCREMENT; array = (T[])new Object[capacity]; // copy elements for( int i = 0; i < size; i++ ) array[i] = old[i]; } // insert the new element insert(x); ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

36 GenericOrderedSet.insert
Algoritmer och datastrukturer GenericOrderedSet.insert private void insert(T x) { // Find the insertion point for x. int i = size; while ( i > 0 && comp.compare(array[i-1],x) > 0 ) { array[i] = array[i-1]; i--; } array[i] = x; // and then insert x size++; ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4

37 Algoritmer och datastrukturer
Exemplet på bild 32 igen GenericOrderedSet<Square> squareSet = new GenericOrderedSet<Square>(rcomp); // konstruktorn GenericOrderedSet(Comparator<? super T> comp) TYPKORREKT! Comparator<Rectangle> är typkompatibel med Comparator<? super Square> eftersom <? super Square> matchas av Rectangle (se bild 18) ©Uno Holmer, Chalmers, :08 Algoritmer och datastrukturer, 17/18, lp 4


Ladda ner ppt "Algoritmer och datastrukturer"

Liknande presentationer


Google-annonser