Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.

Liknende presentasjoner


Presentasjon om: "Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet."— Utskrift av presentasjonen:

1 Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo

2 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 2 Organisering av veldig små programmer  I veldig små programmer (noen få linjer) med en enkelt klasse og ingen objekter av egne klasser, kan all programkode ligge i main-metoden: import easyIO.*; import java.io.*; class VeldigLiteProgram { public static void main (String [] args) { In tast = new In(); System.out.print("Gi et filnavn: "); String fnavn = tast.inLine(); if (new File(fnavn).exists()) { System.out.println("Filen fins"); } else { System.out.println("Filen fins ikke"); }

3 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 3 Organisering av alle andre programmer  I alle andre programmer bør main-metoden kun brukes til å få igang programmet. Eksempel: class MittProgram { public static void main (String [] args) { Flyreservasjon fr = new Flyreservasjon(); fr.ordreløkke(); } class Flyreservasjon { void ordreløkke() {... }

4 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 4 Variant 1  Det er mulig å slå sammen de to klassene på forrige foil til en klasse: class MittProgram { public static void main (String [] args) { MittProgram mp = new MittProgram(); mp.ordreløkke(); } void ordreløkke() {... }  Det blir en smakssak om man velger å gjøre det slik, eller slik som på forrige foil. I undervisningen vil du hovedsakelig se eksempler på den varianten som bruker to klasser.

5 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 5 Variant 2  Istedet for å lage en egen ordreløkke-metode, kan koden for ordreløkken ligge i konstruktøren: class MittProgram { public static void main (String [] args) { Flyreservasjon fr = new Flyreservasjon(); } class Flyreservasjon { Flyreservasjon() {... ordreløkken... }  Dette blir også en smakssak, men varianten ovenfor bruker konstruktøren til noe annet enn initialisering av objektvariable og er mindre gjennomsiktig/selvforklarende enn å bruke en egen ordreløkke-metode.

6 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 6 Oppsummering  Legg ikke annen programkode i main enn det som skal til for å få igang programmet (typisk: lage et objekt og kalle på en metode i dette), unntatt i bittesmå programmer.  I main kan du velge å lage et objekt av klassen som main ligger i - eller et objekt av en annen klasse. I kurset bruker vi stort sett siste variant.  Metoden som kalles fra main er typisk den som er ansvarlig for programkontrollen (f.eks. en ordreløkke), eller en del av den.  Programkontrollen kan ligge i en konstruktør eller i en annen metode (f.eks. void ordreløkke() ). I kurset gjør vi stort sett det siste.  Råd: bestem deg for hvilken organisering du foretrekker (f.eks. den på foil 3) og hold deg til den når du skriver dine egne programmer - så slipper du å bruke tid på å velge hver gang du skal lage et nytt program.

7 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 7 Lese fra fil: repetisjon  Anta at vi skal lese en fil med følgende format:  Først er det en linje med 3 overskrifter (separert av blanke tegn)  Deretter kommer det en eller flere linjer, som hver består av et heltall, et desimaltall og en tekststreng (separert av blanke tegn)  Eksempel:  Dataene som leses skal programmet ta vare på for senere formål. AntallPrisVarenavn 3523.50Oppvaskkost 5333.00Kaffe 9727.50Pizza.........

8 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 8 Framgangsmåte  Den første linja er spesiell, og vi tenker oss her at den ikke er så interessant - vi ønsker bare å få lest forbi den. Det kan vi gjøre med inLine().  De andre linjene har samme format, så vi kan lage en løkke hvor hvert gjennomløp av løkken leser de tre itemene på en linje. Vi bruker da henholdsvis inInt(), inDouble() og inWord().  For å vite når filen er slutt, kan vi enten bruke endOfFile() eller lastItem(). Siden vi leser filen itemvis, er det mest naturlig å bruke lastItem(). Da får vi heller ikke problemer dersom det skulle ligge noen blanke helt på slutten av filen.  Vi hopper over detaljene.

9 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 9 import easyIO.*; class SkrivTilFil { public static void main (String [] args) { Out fil = new Out("filnavn"); fil.outln("Dette er første linje"); fil.close(); } Skrive til fil Vi må først importere pakken easyIO Vi åpner filen for skriving Her skrives en linje med tekst til filen Vi må huske å lukke filen til slutt

10 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 10 Hvilke skrivemetoder finnes? DatatypeEksempelBeskrivelse intfil.out(x); fil.out(x, 6); Skriv x Skriv x høyrejustert på 6 plasser doublefil.out(x, 2); fil.out(x, 2, 6); Skriv x med 2 desimaler Skriv x med 2 desimaler på 6 plasser charfil.out(c);Skriv c Stringfil.out(s); fil.out(s, 6); Skriv s Skriv s på 6 plasser (venstrejustert) fil.outln();Skriv en linjeskift fil.close();Lukk filen Merk: dersom antall plasser spesifiseres og det ikke er plass til det som skal skrives ut, vil det som skrives ut avsluttes med tre punktumer:...

11 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 11 Oppgave  Lag et program som:  leser en tekstfil  erstatter alle forekomster av en bestemt tekststreng s med en ny tekststreng t  skriver resultatet til en ny tekstfil

12 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 12

13 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 13

14 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 14

15 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 15 HashMap  En HashMap er en form for tabell (i likhet med arrayer) som kan brukes til å holde orden på mange objekter. Med en HashMap kan man:  legge inn nye objekter  finne tilbake til et objekt som er lagt inn  fjerne et objekt som er lagt inn  løpe gjennom alle objektene i tabellen  Den viktigste forskjellen mellom array og HashMap:  I en array legger vi inn objekter i en bestemt posisjon, og vi må gå tilbake til denne posisjonen/indeksen når vi senere skal se på objektet. Indeksen er et heltall mellom 0 og length-1.  I en HashMap oppgir vi en bestemt nøkkel (vanligvis en tekststreng) når vi legger vi inn et nytt objekt, og vi oppgir denne nøkkelen når vi senere skal se på objektet. Dvs. indeksen er en tekststreng.

16 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 16 Å opprette en HashMap  I starten av programmet: import java.util.*; Dette importerer pakken java.util hvor bl.a. klassen HashMap ligger.  I klassen eller metoden som skal bruke HashMap'en: HashMap tabell = new HashMap(); Hvis tabellen skal brukes av flere metoder i en klasse, deklareres variabelen ovenfor i starten av klassen (som en objektvariabel). Hvis tabellen kun skal brukes av en enkelt metode, er det naturlig å deklarere variabelen ovenfor inni denne metoden.

17 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 17 Å legge inn et objekt i en HashMap  Et hvilket som helst objekt i Java kan legges inn i en HashMap  Når vi legger et objekt inn i HashMap'en, må vi samtidig oppgi en nøkkel (en tekststreng) som entydig identifiserer objektet.  Vi trenger denne nøkkelen dersom vi senere skal finne eller fjerne objektet i HashMap'en.  Eksempel: Person p = new Person(...); tabell.put("Karin", p); Her lager vi først et Person-objekt (med passende argumenter) og legger det deretter inn i tabellen med "Karin" som nøkkel.

18 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 18  Dersom vi legger inn flere objekter med samme nøkkel, er det bare det sist innlagte objektet som blir liggende i tabellen (de andre overskrives): Person p1 = new Person(...); Person p2 = new Person(...); Person p3 = new Person(...); String navn = "Jens"; tabell.put(navn, p1); // p1 legges inn tabell.put(navn, p2); // p2 legges inn og p1 overskrives tabell.put(navn, p3); // p3 legges inn og p2 overskrives  Noen ganger må vi konstruere en nøkkel ut fra flere variable: String lengdegrad = "67.3"; String breddegrad = "53.3"; String posisjon = lengdegrad + ";" + breddegrad; tabell.put(posisjon, målestasjon);

19 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 19 Å hente et objekt fra en HashMap  For å hente et objekt med utgangspunkt i nøkkelen: Person p = (Person) tabell.get("Jens");  Legg merke til at vi i starten må skrive i parentes navnet på klassen som objektet tilhører - i dette tilfellet klassen Person.  Årsaken er at HashMap'en ikke holder rede på hvilken klasse objektene som legges inn har - bare at det er objekter. Når objektene hentes ut må vi derfor "minne Java på" hvilken klasse objektet var av (dette er egentlig et møte med en avansert og svært nyttig mekanisme i objektorienterte språk som kalles arv og som blir tatt opp i vårens INF1010).  Merk: å hente et objekt fra en HashMap slik som over medfører ikke at objektet fjernes fra HashMap'en.

20 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 20 Å fjerne et objekt fra en HashMap  For å fjerne et objekt med utgangspunkt i nøkkelen: tabell.remove("Jens");  Dersom det ligger et objekt i HashMap'en med den gitte nøkkelen, blir objektet fjernet og setningen ovenfor returnerer med en peker til objektet som fjernes.  Dersom det ikke ligger et objekt i HashMap'en med den gitte nøkkelen, returnerer setningen ovenfor med verdien null.

21 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 21 Å få fatt i alle objektene i en HashMap  For å få fatt i alle objektene i en HashMap på en gang, lager vi en egen oppramsing av alle objektene i HashMap'en: Iterator it = tabell.values().iterator();  Deretter kan vi se på hvert enkelt objekt i HashMap'en ved å gå i løkke: while (it.hasNext()) { Person p = (Person) it.next(); }

22 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 22 To måter å løpe gjennom en HashMap  Løpe gjennom verdiene (som på forrige foil)  Løpe gjennom nøklene Iterator it = tabell.values().iterator(); while (it.hasNext()) { Person p = (Person) it.next(); } Iterator it = tabell.keySet().iterator(); while (it.hasNext()) { String nøkkel = (String) it.next(); }

23 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 23 Metoder i HashMap MetodeEksempelBeskrivelse put tabell.put(id, obj); Legg inn objekt get (Person) tabell.get(id); Finn objekt remove tabell.remove(id); Fjern objekt containsKey if (tabell.containsKey(id)) { // gjør et eller annet } Sjekk om nøkkel finnes i tabell values Iterator it = tabell.values().iterator(); Lag oppramsing av objektene keySet Iterator it = tabell.keySet().iterator(); Lag oppramsing av nøklene

24 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 24 Skal vi bruke array eller HashMap?  Array:  kan lagre et spesifisert antall verdier eller objekter  hver tabell kan bare lagre verdier av én type  HashMap:  kan lagre et uspesifisert antall objekter  hver tabell kan lagre objekter av ulike klasser  kan sette inn og fjerne objekter i tabellen  kan gjøre oppslag ved hjelp av en nøkkel

25 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 25 Et fullstendig eksempel Vi lager et program som består av to klasser:  class TestHashMap (inneholder bl.a. main-metoden)  class Person (med objektvariablene navn og fnr) Programmet skal lage en HashMap og et objekt av klassen Person, og skal legge sistnevnte objekt inn i HashMap'en, med "Petter" som nøkkel. Deretter skal programmet - ut fra nøkkelverdien "Petter" - finne fram Person-objektet igjen i HashMap'en.

26 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 26 Et fullstendig eksempel forts. import java.util.*; class TestHashMap { public static void main (String [] args) { TestHashMap test = new TestHashMap(); } TestHashMap() { HashMap h = new HashMap(); Person p1 = new Person("Petter", "12128646733"); h.put("Petter", p1); Person p2 = (Person) h.get("Petter"); p2.skrivUt(); } class Person { String navn; String fnr; Person (String navn, String fnr) { this.navn = navn; this.fnr = fnr; } void skrivUt() { System.out.println("Navn: " + navn); System.out.println("Fnr: " + fnr); } >javac LagTabell.java >java LagTabell Navn: Petter Fnr: 12128646733

27 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 27 Et større eksempel Vi skal lage et program som ved hjelp av HashMap:  først leser informasjon (= varenavn og pris) om ulike varer fra terminal, og lagrer informasjonen i en HashMap  deretter (når alle varer er innlest) går i løkke og spør om varenavn og søker i HashMapen etter varen (og skriver ut resultatet).

28 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 28 Hele programmet: skisse import java.util.*; import easyIO.*; class Vareoversikt { public static void main (String [] args) { Varelager v = new Varelager(); v.leggInnVarer(); v.søkEtterVarer(); } class Varelager { private HashMap tabell = new HashMap(); In tastatur = new In(); Out skjerm = new Out(); void leggInnVarer() {...} void søkEtterVarer() {...} } class Vare { // Data om en enkelt vare + metoder for å sette og // avlese variablenes verdier }

29 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 29 class Vare class Vare { private String varenavn; private double pris; Vare (String varenavn, double pris) { this.varenavn = varenavn; this.pris = pris; } // Merk: Metoden nedenfor blir ikke brukt og kan derfor sløyfes String fåVarenavn() {return varenavn;} double fåPris() {return pris;} }

30 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 30 Metoden leggInnVarer: skisse void leggInnVarer() { while ( ) { <Legg Vare-objektet inn i HashMap'en med varenavnet som nøkkel> }

31 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 31 Metoden leggInnVarer void leggInnVarer() { skjerm.out("Varenavn: "); String varenavn = tastatur.inWord("\n"); while (!varenavn.equals("avslutt")) { skjerm.out("Pris: "); double pris = tastatur.inDouble(); Vare v = new Vare(varenavn, pris); tabell.put(varenavn, v); skjerm.out("Varenavn: "); varenavn = tastatur.inWord("\n"); }

32 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 32 Metoden søkEtterVarer: skisse void søkEtterVarer() { while ( ) { }

33 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 33 Metoden søkEtterVarer void søkEtterVarer() { skjerm.out("Søk etter vare med navn: "); String varenavn = tastatur.inWord("\n"); while (!varenavn.equals("avslutt")) { Vare v = (Vare) tabell.get(varenavn); if (v == null) { skjerm.outln("Ukjent varenavn!"); } else { skjerm.outln("Pris: " + v.fåPris()); } System.out.print("Søk etter vare med navn: "); varenavn = tastatur.inWord("\n"); }

34 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 34 Programeksempler på nettsiden  Du finner hele programmet vi nettopp gikk gjennom på kursets nettsider, under pekeren "Programmer fra forelesninger" og videre under "Java12".  Der finner du også et enda større programeksempel som illustrerer bruk av HashMap, innlesning fra fil og skriving til fil. Dette eksemplet er laget av en av øvingslærerne (Nils Petter Wien).

35 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 35 ELIZA - den elektroniske psykiater Person : Men are all alike. ELIZA : In what way? Person : They're always bugging us about something or other. ELIZA : Can you think of a specific example? Person : Well, my boyfriend made me come here. ELIZA : Your boyfriend made you come here? Person : He says I'm depressed much of the time. ELIZA : I am sorry to hear that you are depressed. Person : It's true. I am unhappy. ELIZA : Do you think coming here will help you not to be unhappy? Person : I need some help, that much seems certain. ELIZA : What would it mean to you if you got some help? Person : Perhaps I could learn to get along with my mother. ELIZA : Tell me more about your family ELIZA: program skrevet av Joseph Weizenbaum i 1966 for studier av språklig kommunikasjon mellom mennesker og datamaskiner. Programmet imiterer en psykiater, slik som i dette eksemplet:

36 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 36 En samtalepartner Vi skal nå lage to programmer som tilsammen gjør det mulig å "snakke med maskinen", slik at hver gang maskinen gjenkjenner et ord i det vi skriver så gir den et bestemt (og tilnærmet fornuftig) svar.  Det første programmet går i løkke og ber brukeren om å oppgi et ord og et tilhørende svar, og legger dette på en fil "svar.txt".  Det andre programmet skal starte med å lese filen "svar.txt" og skal deretter gå i løkke og be brukeren skrive noe, hvoretter programmer skriver ut tilhørende svar (hvis ordet er registrert).

37 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 37 Lag programmet Test programmet

38 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 38

39 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 39

40 Ole Chr. Lingjærde © Institutt for informatikk4. november 2003 40


Laste ned ppt "Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet."

Liknende presentasjoner


Annonser fra Google