36
Föreläsning 6 Föreläsning 6 Iterationer & arrayer Iterationer & arrayer

Documentf6

  • Upload
    lieth-4

  • View
    219

  • Download
    1

Embed Size (px)

DESCRIPTION

no clue

Citation preview

  • Frelsning 6Iterationer & arrayer

  • Repetition om repetitionerMnga problem lser man genom upprepningar

    Istllet fr att skriva om samma kod upprepade gnger lter vi programmet upprepa samma kod

    Repetitionssatser i Java:ForWhileDowhileOch vi ska idag ven diskutera rekursion

  • Strukturer fr dataData information, vrden, objekt

    Vanligt att data hanteras i grupper

    Vi har sett t.ex. primitiva data i arrayer (flt)

    Vi kommer ven att titta p hur man lagrar objekt i arrayer och i listor

    Och att det r vanligt att hantera dem repetitivt

  • Inmatning av vrden frn tangentbordet

    System.out.println(Ange max 10 tal. Q avslutar.");

    // skapa en array med plats fr 10 flyttal

    double [] resultat = new double[10];

    // skapa ett inlsningsobjekt med klassen Scanner

    Scanner s = new Scanner(System.in);

  • Inmatning av vrden frn tangentbordet

    // Skapa en rknare som pekar ut rtt index

    int maxIndex=0; // antal inlsta element

    // repetera s lnge det finns indata och plats

    while( s.hasNextDouble() && maxIndex

  • Utskrift av vrden frn arrayen

    // skriv ut alla inmatade vrden

    for(int i = 0 ; i

  • KrexempelC:\>java InUtArrayAnge max 10 tal. Q avslutar.5 2 9 3 7 6 1 0 8 4

    Q5.02.09.03.07.06.01.00.08.04.0

    C:\>

  • Enkel sorteringBubbelsortering id:

    Antag array med N stycken element

    Iterera genom alla intilliggande par, d.v.s. element (1,2), (2,3), (3,4), , (N-1,N)

    Jmfr aktuellt elementpar och byt inbrdes plats p de par som r fel ordnade

    Upprepa tills inga utbyten lngre behvs

  • Algoritm i pseudokodArray med N element givenVariabel sortera stts till santUpprepa s lnge som sortera r santsortera stts till falsktUpprepa fr element e = 1 till e = N-1Om array[e] > array[e+1]Byt plats p element e och e+1sortera stts till sant

  • Algoritm i Java-kodpublic void sortera(double [] array) { boolean sortera = true; final int N = array.length; while( sortera ) { sortera = false; for( int e = 0; e < N-1 ; e++ ) if( array[e] > array[e+1] ) { double tmp = array[e]; // byt plats array[e] = array[e+1]; array[e+1] = tmp; sortera = true; // fortstt sortera } } }Att skicka en arraysom parametertill en metod!

  • 529376108425937610842539761084253796108425376910842537619084253761098425376108942537610849Frsta iterationen

  • 2537610849Andra iterationen23576108492356710849235617084923561078492356107489Tredje iterationen2356107489235160748923510674892351064789

  • Fjrde iterationen2351064789231506478923105647892310546789Femte iterationen2310546789213054678921035467892103456789

  • Sjtte iterationen210345678912034567891023456789Sjunde iterationen10234567890123456789

  • InsikterNr en array skickas till en metod kan orginalobjektet komma att pverkas eftersom metoden hanterar samma objekt som omvrlden

    Det r referensvariabelns vrde som kopieras inte array-objektet

    a[0]sortera(double [] a)174320arraysortera(array);

  • Arrayer fr referenser (till objekt)I Java hanteras objekt hur hanteras mnga?

    T.ex. i arrayer av lmplig typ

    Anta att vi har klassen Person med attributen frnamn, efternamn och lder

  • class Person { private String enamn, fnamn; private int alder;

    public Person(String e, String f, int a) { enamn=e; fnamn=f; alder=a; }

    public String toString() { return enamn + + fnamn + , + alder; }

    public void print() { System.out.println( toString() ); } }

  • Array med referenserEn array som kan hantera 10 personer

    Person [] grupp = new Person[10];

    Denna array innehller nu 10 element

    Varje element r en referens

    Dessa har vrdet null

    Det skapas allts INTE 10 personer!

  • En bild av arrayennullnullnullnullnullnullnullnullnullnullEn referens till arrayenArrayen innehller referenser av typen Personsom r initierade till null

  • Lgg in objektgrupp[0] = new Person( Andersson, Eva, 22 );grupp[1] = new Person( Petterson, Adam, 44 );grupp[2] = new Person( Davidson, Anna, 15 );grupp[3] = new Person( Enoksson, Frans, 65 );grupp[4] = new Person( Boudien, Gunilla, 24 );grupp[5] = new Person( Hrd, Niclas, 29 );grupp[6] = new Person( Fridegrd, Lisa, 33 );grupp[7] = new Person( Rask, Johan, 18 );grupp[8] = new Person( Munter, Camilla, 20 );grupp[9] = new Person( Sthl, Peter, 19 );

  • En bild av arrayenPettersonAdam44AnderssonEva22EnokssonFrans65DavidsonAnna15HrdNiclas29BoudienGunilla24RaskJohan18FridegrdLisa33SthlPeter19MunterCamilla20grupp[0]grupp[1]grupp[2]grupp[3]grupp[4]grupp[5]grupp[6]grupp[7]grupp[8]grupp[9]

  • Alt: lgg till objekt i initieringPerson [] grupp = { new Person(Andersson, Eva, 22), new Person(Petterson, Adam, 44), new Person(Davidson, Anna, 15), new Person(Enoksson, Frans, 65), new Person(Boudien, Gunilla, 24), new Person(Hrd, Niclas, 29), new Person(Fridegrd, Lisa, 33), new Person(Rask, Johan, 18), new Person(Munter, Camilla, 20), new Person(Sthl, Peter, 19) };

    //Frdelen r bl.a. att man inte mste ange storlek

  • Personerna individuellt// Plocka fram en person ur arrayen:

    Person p = grupp[4]; // gunillap.print(); // skriver ut info

    // Men eftersom referenserna finns i arrayen// s kan man skriva direkt:

    grupp[4].print();BoudienGunilla24pgrupp[4]

  • Personerna som gruppNu kan personerna hanteras som grupp

    T.ex. kan hela gruppen skickas ngonstans fr behandling

    D.v.s. metodanrop

    Antag att vi vill skapa en metod som skriver ut alla persondata en godtycklig grupp av personer

  • Att verfra arrayer till metoder

    public void skrivUt(Person [] personer) { for( int i=0 ; i < personer.length; i++ ) { System.out.println( personer[i].toString() ); } }OBS syntax fr array-parameterIndexeringArrayens lngd!Den lokala parameterns namnOBS att toString() inte behver anges

  • Att anropa metoden// Antag att vi har vr gamla array med 10 personer:Person [] grupp = new Person[10];grupp[0] = new Person(Andersson, Eva, 22);// OSV...

    skrivUt(grupp); //Metodanropet:

    Andersson Eva, 22Petterson Adam, 44Davidson Anna, 15Enoksson Frans, 65Boudien Gunilla, 24Hrd Niclas, 29Fridegrd Lisa, 33Rask Johan, 18Munter Camilla, 20Sthl Peter, 19

  • Varning fr null!Eftersom vi hr hanterar referenser s kan vi f problem

    Antag att ngot element rkar vara null

    T.ex. genom att arrayen inte r fylld

    Eller att ngot element har satts till null

    grupp[5] = null;

  • En bild av arrayennullPettersonAdam44AnderssonEva22EnokssonFrans65DavidsonAnna15BoudienGunilla24RaskJohan18FridegrdLisa33SthlPeter19MunterCamilla20

  • Vad hnder nu?Det gr alldeles utmrkt att skicka arrayen till metoden skrivUt() Men inne i metoden anropas ju toString() p alla element (personer) Nr loopen kommer till index 5 s blir det i princip: null.toString() Man kan ju inte anropa en metod i ett objekt som inte finns!

    Programmet avbryts av en null pointer exception

  • Eller nnu hemskareHela array-objektet har tagits bort

    Kom ihg att arrayen i sig sjlv r ett objekt

    Person [] grupp = new Person[10];

    ...

    grupp = null;

  • Analys

    public void skrivUt(Person [] personer) { for( int i=0 ; i < personer.length; i++ ) { System.out.println(personer[i].toString()); } }Kan vara nullRisk fr null-pointer exception

  • tgrd

    public void skrivUt(Person [] personer) { if( personer != null ) for( int i=0 ; i < personer.length; i++ ) { if( personer[i] != null ) System.out.println(personer[i].toString()); } }Kan vara nullKontrollera!Kontrollera!

  • Parametrarna till mainpublic static void main(String [] args) { for( int i = 0; i < args.length ; i++ ) System.out.println( args[i] ); }>java TestClass adam bertil 123 667args[0]args[1]args[2]args[3]Programstartadambertil123667

  • Flerdimensionella arrayerEftersom arrayer r objekt, s mste de ju kunna ligga i arrayer,

    Vi kan skapa arrayer med godtyckligt mnga dimensioner int [][] tabell = new int[4][4];

    Tabell r en referens till ett array-objekt som kan innehller referenser till en-dimensionella arrayer

  • tabellfor(int i=0; i
  • Problem arrayer har fix storlekProgrammet r begrnsat till att hantera max t.ex. 10 resultat

    Vi vill att programmet skall kunna hantera godtyckligt mnga element

    Att frndringar i antal element kan ske dynamiskt

    S att programmet anpassar sig till det antal som r aktuellt

    Svrt att stta in objekt inne i arrayen och svrt att ta bort elementNsta frelsning : Listor !