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
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 !