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? } }