Algoriter och Datastrukturer (ALDA/ID005)

Relevanta dokument
Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

DAT043 - föreläsning 8

Föreläsning 3. Stack

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Generisk klass med typparameter Inre klass - ListIterator

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Övning vecka 6. public void method2() { //code block C method3(); //code block D }//method2

Föreläsning 3. Stack

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Laboration 2 Datastrukturer En liten uppgift Frågor

Tentamen Programmering fortsättningskurs DIT950

Objektorienterad programmering med Java, Generics

Föreläsning 8: Exempel och problemlösning

Länkade strukturer. (del 2)

Konstruktion av klasser med klasser

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 2. Länkad lista och iterator

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 2 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Recitation 4. 2-D arrays. Exceptions

Classes och Interfaces, Objects och References, Initialization

Föreläsning 2. Länkad lista och iterator

Objektorienterad Programmering DAT043. Föreläsning 9 12/2-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Stackar, köer, iteratorer och paket

Objektorienterad Programmering (TDDC77)

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

TDA550 Objektorienterad programvaruutveckling IT, forts. kurs Övning vecka 5

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

Seminarium 3 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

LÖSNINGSFÖRSLAG

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Seminarium 2 Introduktion till Java Collections Framework Innehåll. Generik Bakgrund. Exempel på en generisk klass java.util.arraylist.

I18N språkoberoende. ResourceBundle. Ikoner. Färg. Javadoc. Meny

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Generics och polymorfism. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Tentamen. Lösningsförslag

Generiska typer. Java 5.0: Säkrare, snyggare, smidigare. Viktigaste utökningarna av språket: Autoboxing/unboxing, bakgrund.

Övning vecka 5. Denna vecka ska vi titta pa samlingar, generics och designmönstren Decorator, Singleton och Iterator.

Föreläsning 12. Länkade listor

Lösningsförslag till exempeltenta 2

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista Läsanvisningar och uppgifter

Subtyping, co- och contra-variance. Objekt-orienterad programmering och design Alex Gerdes, 2016

Klasshierarkier - repetition

Föreläsning 2 Datastrukturer (DAT037)

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Outline. Objektorienterad Programmering (TDDC77) Abstrakta klasser. Abstrakta metoder. Abstrakta klasser. Gränssnitt. Uppräkningar (enum) Ahmed Rezine

Datastrukturer. Arrayer. Arrayer. Arrayer. Array av arrayer. Array av arrayer

Outline. Objektorienterad Programmering (TDDC77) Signatur. Klassen calculator. Överlagring (overloading) Arv (inheritance) Ahmed Rezine

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Generiska klasser och funktioner

Föreläsning 4 Innehåll

Svaret kan ges i Javakod (eller i UML-klassdiagram). public class A { B minb;... } public class B { <B:s många variabler och metoder> } Lösning:

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Objektorienterad Programmering (TDDC77)

Tentamen i Algoritmer & Datastrukturer i Java

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Föreläsning 2 Datastrukturer (DAT037)

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

Outline. Objektorienterad Programmering (TDDC77) Åsidosättning. Signatur. Åsidosättning. Abstrakta klasser. Ahmed Rezine.

UML. Översikt UML. Relationer mellan klasser. A är ett aggregerat av B:n. Kontor aggregat av Enheter. 12 olika diagramtyper, bl.a.

Tentamen Objekt-orienterad programmering i Java, 5p distanskurs

Föreläsning 9. Generiska enheter Inre klasser Anonyma klasser Kloning

The Last Adventure. Innehåll. Objektorientering. Språket Java. Java - Paket. Java - synlighet. Den sista lektionen. Repetition.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Grundläggande termer. Några olika system. F11 Grunderna i Versionshantering. Git basic. Origin. Git basic. Git basic. Local #1. Local #3.

Programmering för språkteknologer II, HT2011. Rum

DAT043 Objektorienterad Programmering

Designmönster/Design patterns

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Länkade strukturer, parametriserade typer och undantag

Föreläsning 12: Exempel och problemlösning

Programmering för språkteknologer II, HT2014. Rum

Datastrukturer. föreläsning 3. Stacks 1

Att skriva till och läsa från terminalfönstret

Transkript:

Algoriter och Datastrukturer (ALDA/ID005) Algoritmer och datastrukturer, varför det? Algoritmer är oberoende av programmeringsspråket som används Rätt datastruktur kan vara halva lösningen på ett problem Algoritmer kommer att bli viktigare och viktigare Föreläsning 1 Introduktion till kursen, generics, design patterns Beatrice Åkerblom beatrice@dsv.su.se Henrik Bergström henrikbe@dsv.su.se 2 Datastrukturer http://www.nist.gov/dads/ Kursupplägg 3

Information för kursen Daisy Kursbeskrivning Kursmål Betygskriterier Schema Kursresultat Kurs-PM Länkar till föreläsningsbilder Instruktioner för inlämningsuppgifter Kursbok Data Structures and Algorithm Analysis in Java av Mark Allen Weiss 5 6 Hederskodex Inlämningsuppgifterna skall lösas och redovisas individuellt. Attlåta någon annan lösa en inlämningsuppgift och sedan lämna in den kan leda till avstängning från studierna. Trots att varje student skall skriva sin kod själv är det dock tillåtet att diskutera med andra(studenter/lärare/syskon/etc.) och få hjälp med vissa bitar. Om man på detta sätt får hjälp med en del av sitt program måste manändå veta helt vad den delen gör och man måste skriva i en kommentar till koden att man har fått hjälp och av vem. Läs mer om detta på: http://www.dsv.su.se/utbildning/hederskodex Aktiviteter Föreläsning Grupparbete (2-3 personer) Seminarium individuell övning och gruppövning Individuella uppgifter muntlig redovisning 7 8

Vad är Generics? Generics Generics är abstraktioner som bygger på typer Klasser, gränssnitt och metoder kan parametriseras m.h.a.typer Generics möjliggör ökad läsbarhet och typsäkerhet 10 Förr i tiden Nuförtiden Java 1.0 1.4 hade inte stöd för generics Många ansåg att detta var Javas största svaghet Inga homogena samlingsklasser Stort behov av typomvandlingar Inga kontroller vid kompilering ledde till att fel upptäcktes sent LinkedList list = new LinkedList(); list.add(new Integer(0)); Integer i = (Integer) list.get(0); String s = (String) list.get(0); //ger fel vid //körning Samlingsklasser är homogena Minskat behov av typomvandlingar Kontroller vid kompilering baserad på statisk typinformation LinkedList<Integer> list = new LinkedList<Integer>(); list.add(new Integer(0)); Integer i = list.get(0); String s = list.get(0); // ger fel vid kompilering 11 12

class Stack { void push(object o) { Object pop() { String s = "Hello"; Stack st = new Stack (); st.push(s); s = (String) st.pop(); class Stack<A> { void push(a a) { A pop() { String s = "Hello"; Stack<String> st = new Stack<String>(); st.push(s); s = st.pop(); Generics och arv Begränsningar kan definieras för vilken typ av typer som får användas som typ-parametrar till en klass Detta kan åstadkommas genom att ange en godkänd gemensam supertyp för de typ-parametrar som kan användas Subtyper skapas i Java med hjälp av arv 13 14 Begränsning av typ-parameter Begränsning av typ-parameter, forts. interface Comparable<I> { boolean lessthan(i); Inuti en typ-parametriserad klass kan typ-parametern användas som vilken typ somhelst class PriorityQueue<T extends Comparable<T>> { T queue[ ] ; void insert(t t) { if ( t.lessthan(queue[i]) ) T remove() { 15 public class OuterClass<T> { private class InnerClass<E extends T> { 16

Begränsning av typ-parameter, forts. Generics och subtypning Flera begränsningar kan användas för att specificera en typ-parameter: Kan vi se några problem med följande kodsnutt? <T extends A & B & C & > List<String> ls = new ArrayList<String>(); //1 List<Object> lo = ls; //2! interface A {! interface B { Rad 1 innebär inga problem. På rad 2 måste vi dock fråga oss om en lista av String är en lista av Object?! class MultiBounds<T extends A & B> {!! 17 o.add(new Object()); // 3 För alla typer A och B, gäller att Subtype(A, B)!=> Subtype (Collection<A>, Collection<B>) 18 Subklassning Hantera alla samlingar import java.awt.color; public class Subclass extends MyClass<Color> { På den gamla tiden före Java 1.5 skulle man kunna göra på följande sätt för att skriva ut alla element från alla typer av samlingar: // You almost always need to supply a constructor public Subclass(Color color) { super(color); public static void main(string[ ] args) { Subclass sc = new Subclass(Color.GREEN); sc.print(color.white); 19 void printcollection(collection c) {! Iterator i = c.iterator();! for (k = 0; k < c.size(); k++) {!! System.out.println(i.next()); 20

Hantera alla samlingar, ett första försök Nytt försök med wildcards void printcollection(collection<object> c) {! for (Object e : c) {!! System.out.println(e);! Mycket mindre användbar Den gamla kunde användas på alla typer av samlingar med alla typer av typ-parametrar Collection<Object> är ju inte en supertyp för alla typer av samlingar 21 Vad är supertypen för alla typer av samlingar med alla typer av typparametrar? Svaret är att det är samlingen av okänd typ, dvs Collection<?> Det ger oss en samling vars elementtyp kan vara vilken somhelst void printcollection(collection<?> c) {! for (Object e : c) {!! System.out.println(e);! 22 Design patterns Designmönster Vad är det? Ska ni veta Var hittar man dem? 24

Professor Coupling Sheep class Sheep { public Sheep( ) { //this is a spanish sheep, so it sounds like a spanish sheep! System.out.println( "beeeee. I'm a new Sheep" ); 25 26 Cloning machine Cow class CloningMachine { public CloningMachine( ) {! public Sheep buildclone( ) { return new Sheep( );! public Sheep[] buildmanyclones( int clonenum ) { Sheep[] returnarray = new Sheep[ clonenum ];!! for( int k=0; k< clonesnum; k++ ) { returnarray[ k ] = new Sheep( );!!!!! return returnarray;!! 27 28

Cloning machine Cloning machine class CloningMachine { function CloningMachine( ) {! public Sheep buildclone( ) { return new Sheep( ); public Cow buildcowclone( ) { return new Cow( );! public Sheep[] buildmanyclones( int clonenum ) { Sheep[] returnarray = new Sheep[ clonenum ];!! for( int k=0; k< clonesnum; k++ ) { returnarray[ k ] = new Sheep( );!!!!! return returnarray;!! 29 class CloningMachine{ public CloningMachine( ){! public Object buildclone( String type ) { if( type.equals( "sheep" ) ) { return new Sheep( ); else if ( type.equals( "cow" ) ) { return new Cow( );! public Sheep[] buildmanyclones( int clonenum ) { Sheep[] returnarray = new Sheep[ clonenum ];!! for( int k=0; k< clonesnum; k++ ) { returnarray[ k ] = new Sheep( );!!! return returnarray;!! 30 CloneableAnimal public interface CloneableAnimal extends Cloneable { public CloneableAnimal duplicate( ); Sheep public class Sheep implements CloneableAnimal { public Sheep( ) { System.out.println( "Sheep template created" ); public CloneableAnimal duplicate( ) { System.out.println( "the Sheep will clone itself" ); Sheep returnvalue = null; try { returnvalue = ( Sheep ) super.clone( ); catch( Exception e ) { System.out.println( "error cloning Sheep" ); return returnvalue; 31 public String tostring( ) { return "I'm a sheep clone, beeeeee"; 32

A Cow public class Cow implements CloneableAnimal { public Cow( ) { System.out.println( "Cow template created" ); public CloneableAnimal duplicate( ) { System.out.println( "creating a new Cow instance" ); return new Cow( ); public String tostring( ) { return "Muuuu, cow clone" ; Cloning machine public class CloningMachine { public CloningMachine( ) { public CloneableAnimal newclone( CloneableAnimal template ) { return template.duplicate( ); public CloneableAnimal[] clonemany( int itemcount, CloneableAnimal template ) { CloneableAnimal[] returnvalue = new CloneableAnimal[itemCount]; for( int i=0; i< itemcount; i++ ) { returnvalue[ i ] = template.duplicate( ); return returnvalue; 33 34 public class ProfessorCoupling { public static void sayit( String words ){ System.out.println( "" ); System.out.println( words ); System.out.println( "" ); public static void main( String[] args ){ CloningMachine cm = new CloningMachine(); sayit( "creating Sheep and Cow templates" ); Sheep sheeptemplate = new Sheep( ); Cow cowtemplate!! = new Cow( ); Cow clonedcow = (Cow) cm.newclone(cowtemplate); sayit( "first cloned cow" ); Sheep clonedsheep = (Sheep) cm.newclone(sheeptemplate); sayit( "first cloned sheep" ); System.out.println( clonedsheep ); sayit( "Creating 10 new cows" ); CloneableAnimal[] newcows = cmachine.clonemany( 10, cowtemplate ); That Was the Prototype pattern sayit( "Creating 10 new Sheeps" ); CloneableAnimal[] newsheeps = cmachine.clonemany( 10, sheeptemplate ); sayit( "Testing the cows created" ); for( int i=0; i< newcows.length; i++ ) { System.out.println( newcows[ i ] ); sayit( "Testing the sheeps created" ); for( int i=0; i< newsheeps.length; i++ ) { System.out.println( newsheeps[ i ] ); 36

Different roles cow sheep??? soldier cow peasant cow soldier sheep peasant sheep soldier??? peasant??? 37 Interfaces All classes implement: public interface ISubject { public Role getextension( String extname ); Extension Objects pattern Interface to encapsulate actions: 39 public interface IBasicActions { public void movearms( ); public void movelegs( ); public void eat( ); 40

Sheep Roles public class Sheep implements ISubject, IBasicActions { private SoldierRole soldierrole; private PeasantRole peasantrole; public Sheep( ) { System.out.println( "I'm a sheep" ); public Role getextension( String extname ){ Role returnvalue = null; if( extname.equals( "SoldierRole" ) ) { if( soldierrole == null ) { returnvalue = new SoldierRole( this ); else { returnvalue = soldierrole; if( extname.equals( "PeasantRole" ) ) { if( peasantrole == null ) { returnvalue = new PeasantRole( this ); else { returnvalue = peasantrole; return returnvalue; 41 public abstract class Role { public class SoldierRole extends Role implements ISoldierActions { private IBasicActions subject; public SoldierRole( IBasicActions subject ) { this.subject = subject; System.out.println( "SoliderBehaviour created" ); public void destroy( ) { public void moveto( ) { 42 Refactored Sheep public class ProfessorCoupling { public static void main( String[ ] args ) { Sheep sheep = new Sheep( ); ISoldierActions soldiersheep = (ISoldierActions) sheep.getextension("soldierrole"); soldiersheep.destroy( ); IPeasantActions peasantsheep = (IPeasantActions) sheep.getextension("peasantrole"); peasantsheep.dogardening( ); public interface ISubject { public Role getextension( String extname ); public void addextension( String extname, Role extension ); public void removeextension( String extname ); import java.util.hashmap; public class Sheep implements ISubject, IBasicActions { private HashMap rolescol; public Sheep( ) { System.out.println( "I'm a sheep" ); rolescol = new HashMap( ); public Role getextension( String extname ) { return ( Role ) rolescol.get( extname ); public void addextension( String extname, Role extension ) { rolescol.put( extname, extension ); public void removeextension( String extname ) { rolescol.remove( extname ); public void movearms( ) { // movement implementation System.out.println( "the sheep moves one arm" ); public void movelegs( ) { // movement implementation System.out.println( "the sheep moves one leg" ); public void eat( ) { // implements the way sheeps eat System.out.println( "munch. munch" ); 44

Sheep, cont d public class ProfessorCoupling { public static void main( String[ ] args ) { Sheep sheep = new Sheep( ); sheep.addextension( "SoldierRole", new SoldierRole( sheep ) ); ISoldierActions soldiersheep = ( ISoldierActions ) sheep.getextension( "SoldierRole" ); soldiersheep.destroy(); sheep.removeextension( "SoldierRole" ); sheep.addextension( "PeasantRole", new PeasantRole( sheep ) ); IPeasantActions peasantsheep = ( IPeasantActions ) sheep.getextension( "PeasantRole" ); peasantsheep.dogardening( ); public void movearms( ) { // movement implementation System.out.println( "the sheep moves one arm" ); public void movelegs( ) { // movement implementation System.out.println( "the sheep moves one leg" ); public void eat( ) { // implements the way sheeps eat System.out.println( "munch. munch" ); 46 Roles public abstract class Role { public class SoldierRole extends Role implements ISoldierActions { private IBasicActions subject; public SoldierRole( IBasicActions subject ) { this.subject = subject; System.out.println( "SoliderBehaviour created" ); public void destroy( ) { System.out.println( "Soldier interface. destroy" ); //Use some of the animal's methods subject.eat( ); public void moveto( ) { System.out.println( "Soldier Interface. moveto" ); //Use some of the animal's methods subject.movelegs( ); 47 Roles, cont d public class PeasantRole extends Role implements IPeasantActions { private IBasicActions subject; public PeasantRole( IBasicActions subject ) { this.subject = subject; System.out.println( "PeasantBehaviour created" ); public void driveto( ) { System.out.println( "I drive to " ); //Use some of the animal's methods subject.movearms( ); subject.movelegs( ); public void dogardening( ) { System.out.println( "OK, gardening" ); //Use some of the animal's methods subject.movearms( ); 48

public class SoldierRole extends Role implements ISoldierActions { private IBasicActions subject; public SoldierRole( IBasicActions subject ) { this.subject = subject; System.out.println( "SoliderBehaviour created" ); public void destroy( ) { System.out.println( "Soldier interface. destroy" ); //Use some of the animal's methods subject.eat( ); public void moveto( ) { System.out.println( "Soldier Interface. moveto" ); //Use some of the animal's methods subject.movelegs( ); public void waitformoreorders( ) { System.out.println( "I'll wait for more orders. Beeeeeee" ); class ProfessorCoupling { public ProfessorCoupling( ) { public void attack( ISoldierActions[] soldiers, IPeasantActions[] peasants ) { int soldierscount = soldiers.length; int peasantscount = peasants.length; for( int idx=0; idx< soldierscount / 2; idx++ ) { soldiers[ idx ].destroy( ); for( int idx=soldierscount/2; idx< soldierscount; idx++ ) { soldiers[ idx ].waitformoreorders( ); for( int idx=0; idx< peasantscount / 2; idx++ ) { peasants[ idx ].dogardening( ); for( int idx=peasantscount/2; idx< peasantscount; idx++ ) { peasants[ idx ].driveto( ); Read more Command Pattern Observer pattern Slut för idag! http://www.design-nation.net/en/design_patterns/ 51 52