import java.util.Scanner; import java.io.File; import java.util.ArrayList; class Hovedprogram { public static void main(String[] args){ // !Kode for ? teste klassen Person. // Du kan kommentere ut dette med: /* ... */ Person person = new Person("Rolf", 12); System.out.print("henter alder: "); int alder = person.hentAlder(); System.out.println(alder); System.out.println("har bursdag! Da skal alder ?ke med ¨Śn."); person.harBursdag(); System.out.print("henter alder p? nytt: "); alder = person.hentAlder(); System.out.println(alder); // !Kode for ? lese brukerinput fra terminal, lese fra fil og // opprette Person-objekter basert p? filinformasjon. // MERK: filen "lesFra.txt" m? ligge i samme mappe som filene // "Hovedprogram.java" og "Person.java". Husk ? kompilere f?r // du kj?rer programmet: "javac *.java && java Hovedprogram" // Oppretter et Scanner-objekt for ? lese fra terminal. // Vi sender da med "System.in" som argument da vi ?nsker // ? lese fra nettopp terminalen. Scanner skan = new Scanner(System.in); //husk ? skrive HELT RIKTIG filnavn, alts? "lesFra.txt" System.out.print("Skriv inn filnavn: "); // Scanner har en metode nextLine() for ? hente input fra bruker. // Vi lagrer brukers input som en variabel "linje" av typen String. String linje = skan.nextLine(); // Oppretter enda et Scanner objekt for ? lese fra fil. For ? f? tilgang // til referansen "fil" utenfor try/catch-blokken s? m? vi opprette denne // referansen nettopp utenfor try/catch-blokken. Scanner fil = null; try { // Denne linjen med kode kan f?re til en FileNotFoundException. // Dette er en type exception som vi m? gj?re noe med. Vi bruker // derfor en try/catch. DERSOM denne linjen med kode f?rer til en // feil - s? blir feilen "fanget". Dette skal vi l?re mer om senere. fil = new Scanner(new File(linje)); } catch(Exception e){ System.out.println("HEHE"); System.out.println(e); } // N? har vi et Scanner-objekt som leser fra et File-objekt. File-objektet // er knyttet til filen v?r - "lesFra.txt". // nextInt() leser neste tall i filen. Vi lagrer dette i variabelen "antall". int antall = fil.nextInt(); // P? dette tidspunktet vil Scanneren fremdeles v?re p? f?rste linje i // tekstfilen. Grunnen til dette er at vi leste inn et tall, og ikke en linje. // for ? unng? ? fortsette p? denne linjen - som er tom - s? kaller vi metoden // nextLine(). Returverdien av dette er bare en tom streng, og den trenger vi // ikke ? lagre. fil.nextLine(); // For ? lagre Person-objektene vi skal opprette lager vi et Array. // Her m? vi spesifisere st?rrelse. Siden vi allerede har hentet ut f?rste // tall fra filen og lagret dette i variabelen "antall" kan vi bruke denne. // antall = 4. Arrayet har derfor 4 plasser - eller 4 indekser. Fra 0 til // og med 3. Person[] listen = new Person[antall]; // N? ?nsker vi ? lese en og en linje fra filen v?r. // Vi lager derfor en while-l?kke. metoden hasNextLine() returnerer // "true" dersom det finnes flere linjer i filen v?r. while (fil.hasNextLine()){ // med metoden nextLine() henter vi hele neste linje fra filen. // i f?rste iterasjon av while-l?kken vil dette v?re "1Magnus 24" // dette lagres i variabelen "line". String line = fil.nextLine(); // Denne linjen m? vi s? splitte, for ? f? tak i de ulike delene. String[] ord = line.split(" "); // I f?rste iterasjon av while-l?kken vil arrayet "ord" inneholde to // elementer. ord[0] = "1Magnus" og ord[1] = "24". // For ? hente ut det vi trenger m? vi konvertere fra String til int. int tall = Integer.parseInt(ord[1]); // For ? hente kun navnet m? vi finne substringen i ordet som inneholder // navnet. For ord[0] i f?rste iterasjon - som er "1Magnus", vil vi // hente ut substringen som starter fra 1 indeks i ordet. Dette er // det samme som ? fjerne den f?rste bokstaven i en String. String navn = ord[0].substring(1); // Vi ?nsker ogs? ? lagre dette tallet i "1Magnus". Vi m? da hente // substringen fra indeks 0 til MEN IKKE MED indeks 1 i strengen // "1Magnus." Vi f?r da "1". S? m? "1" konverteres fra en String til // en int. int indeks = Integer.parseInt(ord[0].substring(0,1)); // N? har vi leste en hel linje fra filen og hentet n?dvendig informasjon! // Vi kan derfor opprette et nytt Person-objekt og bruke informasjonen // vi har lest fra filen. Person ny = new Person(navn, tall); // P? samme m?te som Scanner referansen "fil" m?tte deklareres utenfor // try/catch blokken - s? m? vi gj?re noe for ? miste pekeren til det // nye Person-objektet vi har opprettet. Vi legger derfor denne referansen, // alts? "ny" inn i Arrayet vi har laget. // Vi bruker da variablen indeks for ? finne riktig plass i Arrayet, // men m? passe p? ? trekke fra 1. Dette m? vi gj?re da lister starter // fra indeks 0. listen[indeks-1] = ny; // N? kan vi tenke oss at ?N iterasjon av while l?kken er ferdig. // Det vil si at ?N linje er lest og ETT Person-objekt er opprettet. // F?rste linje som leses er igjen "1Magnus 24" og Person-objektet // som opprettes har de private variablene String navn = "Magnus" // og int alder = 24. } // Etter at while-l?kken er ferdig s? har vi lest alle linjene // og opprettet alle Person-objektene. Den eneste referansen vi // har til disse objektene er i Arrayet v?rt "listen". Vi iterer // derfor gjennom denne og kaller p? metoden skrivInfo() som // finnes i Person-klassen for hvert Person-objekt. for (int i = 0; i < listen.length; i++){ listen[i].skrivInfo(); // Er det samme som: // Person p = listen[i] // p.skrivInfo(); } // NYTTIGE OPPGAVER: // 1. // Bytt ut Array med en ArrayList. Hvordan opprettes denne? Hvordan // legge til objekter i en ArrayList? Hvordan iterere gjennom en // arraylist. // 2. // Lag en klasse Hus. La huset inneholde et array med st?rrelse 3. // Klassen hus skal ha en metode "public boolean FlyttInn(Person p)" // Pr?v s? ? legge inn Person-objektene i en instans av klassen Hus. // Evt lek litt rundt med dette. Hva skal feks skje hvis det ikke // er mer plass i huset? Hva med ? legge til en metode som skriver ut // informasjon om alle beboerne i huset? } }