INF Forelesning 10. Eksempler på Hashmap Oppramstyper Innstikksortering Javadoc

Like dokumenter
INF1000 (Uke 12) Sortering

Oppramstyper, HashMap og Innstikksortering, litt. 6. oktober 2009, Arne Maus Inst. for informatikk, UiO

Uke 8 - Oppramstyper, HashMap og Innstikksortering, litt javadoc. 17. oktober 2013, Arne Maus Inst. for informatikk, UiO

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

! " ##$ % 4 2, &/ ( & +, )-. &* &/ ),* 0, 1 1 ( &/ 2& &, & &/ &,, &/" 2 &/ 2 ) *

( & ( &/ 2& , )-. &* &/ ),* 0, &/ 2 ) *

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

Gjennomgang av en tenkt eksamensoppgave

Gjennomgang av en tenkt eksamensoppgave

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

UNIVERSITETET I OSLO

INF Forelesning 10

UNIVERSITETET I OSLO

1. Separatorer (skilletegn) i easyio

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

UNIVERSITETET I OSLO

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

INF Uke 10. Ukesoppgaver oktober 2012

Uke 9 INF okt 2012 Om separatorer I easyio, Eliza (bruk av HashMap), + mer om metoder og klasser. Arne Maus OMS, Ifi, UiO

IN1010 våren januar. Objektorientering i Java

Forelesning inf Java 5

Forelesning inf Java 5

Innlesning fra tastatur med easyio. INF1000 høst Vi må først skrive i toppen av programmet: import easyio.*;

INF1010 våren januar. Objektorientering i Java

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

UNIVERSITETET I OSLO

INF1010 Sortering. Marit Nybakken 1. mars 2004

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Ole Christian Lingjærde, 12. september 2013

Eksempel: Body Mass Index (BMI) Forelesning inf Java 3. Ferdig program (første del) Ferdig program (siste del)

Forelesning inf Java 4

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

UNIVERSITETET I OSLO

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

TOD063 Datastrukturer og algoritmer

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

b) 10 2 = 20 c) 5 1 = 5.

UNIVERSITETET I OSLO

INF 1000 høsten 2011 Uke september

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

INF1000 undervisningen INF 1000 høsten 2011 Uke september

INF1000: Forelesning 10

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

UNIVERSITETET I OSLO

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

INF1000: Forelesning 6. Klasser og objekter del 1

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

INF1000 (Uke 6) Mer om metoder, tekster

Løsningsforslag INF desember 2007

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

UNIVERSITETET I OSLO

INF1000 : Forelesning 5

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

Hvis en person har inntekt < , så betaler han 10% skatt på alt, og ellers betaler han 10% skatt på de første og 30% på resten.

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

Løsningsforslag til eksamen i INF1000 våren 2006

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

INF1000 Uke 4. Innlesning fra terminal. Uttrykk og presedens. Oversikt

Blokker og metoder INF1000 (Uke 6) Metoder

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Blokker. Uke 4, INF 1000, 13 sept Løkker og arrayer. Eksempel. Deklarasjoner inne i blokker. Institutt for Informatikk Universitet i Oslo

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Oblig4 - forklaringer. Arne og Ole Christian

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

s 678 * Hvordan designe og programmere objektorientert * Støtte til oppstart på Oblig 4: Jobbe frem eget forslag til datastruktur

INF 1000 høsten 2011 Uke 10: 25. november

INF1000 : Forelesning 4

Repetisjon. INF gruppe 13

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

Dagens tema Kapittel 8: Objekter og klasser

Løsningsforslag ukeoppg. 3: sep (INF Høst 2011)

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Body Mass Index (BMI) INF1000 : Forelesning 3. Ferdig program (forts.) Ferdig program

INF1000 Uke 5. Litt om objekter, filer med easyio, tekst

UNIVERSITETET I OSLO

Ukeoppgaver INF1000: 12. feb 16. feb

Oblig4: Komme igang. INF1000 Uke 11. Filer Vi skal lese data fra to filer og analysere dem (Stasjoner-1.txt, Vaerdata-1.txt) Noen generelle tips

INF1000 oppgaver til uke 38 (17 sep 23 sep)

Transkript:

INF1000 - Forelesning 10 Eksempler på Hashmap Oppramstyper Innstikksortering Javadoc

Oppgave Anta at du har deklarert en HashMap: HashMap<String,String> cdsamling = new HashMap<String,String>(); Du legger inn informasjon om CD ene dine i HashMapen med platens tittel som nøkkel og artistnavnet som verdi. Eksempel: cdsamling.put( Not going under, Maria Arredondo ); Skriv noen programsetninger som: først ber om og leser inn et artistnavn fra tastatur deretter går gjennom HashMapen og skriver ut titlene til alle platene du har registrert med denne artisten. Du kan anta at programsetningene plasseres slik i programmet at de har tilgang til HashMapen cdsamling.

In tast = new In(); System.out.print( Artistens navn: ); String artistnavn = tast.inword( \n ); for( String tittel:cdsamling.keyset() ){ String navn = cdsamling.get(tittel); if (navn.equals(artistnavn)) System.out.println(tittel);

Moral når du løper gjennom en HashMap: Hvis du bare er ute etter verdien, kan du iterere over values() Hvis du er ute etter både nøkkelen og verdien, kan du iterere over keyset() for å finne nøkkelen, og bruke get for å finne verdien.

Oppgave Filen SpamOrd.txt inneholder en del spam-ord (atskilt av blanke tegn). Du skal lage et program som leser SpamOrd.txt og som deretter leser filen Epost.txt og sjekker om denne inneholder noen av spam-ordene. Programmet skriver til slutt ut på skjermen om filen Epost.txt inneholdt noen spam-ord eller ikke (du trenger ikke å skrive ut hvilke eller hvor mange spam-ord filen inneholdt). Du kan anta at SpamOrd.txt maksimalt inneholder 200 ord. I denne oppgaven kan du godt legge all programkoden inn i mainmetoden.

import easyio.*; import java.util.*; class Spam { public static void main (String[] args) { HashMap<String,String> h = new HashMap<String,String> (); In spamfil = new In( SpamOrd.txt ); while (!spamfil.lastitem()) { h.put(spamfil.inword(), null); In epostfil = new In( Epost.txt ); boolean funnet = false; while (!epostfil.lastitem() &&!funnet) { if (h.containskey(epostfil.inword()) funnet = true; if (funnet) System.out.println( Spam-ord! ); else System.out.println( Ingen spam-ord );

Oppgave: Lage et psykolog-program Tar inndata et spørsmål/en setning fra pasienten og svare som en dårlig psykolog Ha en fil med enkeltord, og hvis pasienten bruker et av ordene, så svare med tilhørende setning Bruke en HashMap for å holde par av ord, setning Eks: far, Fortell meg om din far Må ha noe å si hvis vi ikke får treff: Så interessant, fortell meg mer om dette. 7

> hei Hei, jeg heter Sigmund, hva heter du > Jeg heter Arne Så det er altså navnet > Ja Fint, skal vi snakke om din barndom? > Ja og særlig om mor Fint, skal vi snakke om din barndom? > Mor sier jeg jo Lever fortsatt din mor > nei Så du mener ikke det > hun slo meg ofte Var det ofte at noen slo? > ganske ofte Interessant. Fortell mer. > 8

Programskisse import easyio.*; import java.util.*; class Eliza { public static void main(string [] args) { class Samtale { HashMap hash = new HashMap<String,String>(); In tast = new In(); void lesfrafil() { void snakk() { 9

import easyio.*; import java.util.*; class Eliza { public static void main (String [] args) { if (args.length!=1) { System.out.println(" bruk: >java Eliza <fil-med-ord> "); else { Samtale sam = new Samtale(); sam.lesfrafil(args[0]); sam.snakk(); // end main 10

class Samtale { HashMap<String,String> hash = new HashMap<String,String>(); In tast = new In(); void lesfrafil (String filnavn) { In fil = new In(filnavn); while (!fil.lastitem()) { String søkeord = fil.inword(); String svar = fil.inline(); hash.put(søkeord, svar); fil.close(); System.out.println ("Antall ord lest: " + hash.size()); 11

void snakk() { while (true) { System.out.print("> "); boolean funnetmatch = false; do { String ord = tast.inword().tolowercase(); if (hash.containskey(ord)) { String svar = hash.get(ord); System.out.println(svar); funnetmatch = true; while (tast.hasnextchar() &&!funnetmatch); if (!funnetmatch) { System.out.println("Interessant. Fortell mer."); if (tast.hasnextchar()) { tast.readline(); // Tømmer inputbufferet // end snakk 12

Ordfil.txt far Fortell meg mer om din far faren Hadde du et vanskelig forhold til din far? slo Var det ofte at noen slo? lei Du sier du er lei deg, hvorfor det mor Lever fortsatt din mor penger Er du bekymret for om du har nok penger sint Hvorfor bruker du 'sint' - er du selv sint glad Så bra ikke Forklar dette nærmere vær Blir du deprimer av dårlig vær nei Så du mener ikke det ja Fint, skal vi snakke om din barndom? barn Har du barn eller barnebarn? barnebarn Hva heter de datter Hvor gammel er hun? hei Hei jeg heter Sigmund, hva heter du jeg Hvordan føler du deg heter Så det er altså navnet gjenta Vil du heller snakke om din mor? 13

ALICE: En kunstig intelligensbasert prate-robot ALICE = Artificial Linguistic Internet Computer Entity http://alice.pandorabots.com QuickTime and a TIFF (Uncompressed) decompressor are needed to see this picture.

Oppramstyper (enum) - motivasjon Java-program for å registrere møtedeltakelse Vi trenger f.eks. klassene Møte og Deltaker En deltaker kan enten Delta på møtet Ikke delta på møtet Kanskje delta på møtet Lagres som deltakerstatus for hver deltaker Hvordan representere i Java? To boolean-variable: delta, ikkedelta Delta: delta == true, ikkedelta == false Ikke delta: delta == false, ikkedelta == true Kanskje: delta == true, ikkedelta == true Tungvint! Bruk heller enum i Java 15

enum å lage egne oppramstyper Brukes til å lage typer som har et lite antall verdier enum Status { DELTAR, DELTAR_IKKE, Status s er DELTAR DELTAR_KANSKJE; Status ss er DELTAR Status ss er DELTAR_IKKE class EnumEks { Status ss er DELTAR_KANSKJE public static void main(string[] args) { Status s = Status.DELTAR; System.out.println("Status s er " + s); for (Status ss : Status.values()) { System.out.println("Status ss er " + ss); 16

enum kan ha metoder; en enum virker omtrent som en klasse-deklarasjon.

Sortering Lære å løse et vanskelig problem Sortering mange metoder, her innstikksortering Sortere hva: Heltall Tekster Lære abstraksjon Når vi har løst ett problem, kan lignende problemer løses tilsvarende Lære å lage proff programvare ved å lage en generell klasse (en vektøyboks) for sortering Hvordan deklarere en slik klasse Javadoc lage dokumentasjon Testing Hvordan utvikle programmet 18

Sortering Mange datatyper kan sorteres Tall Tekster (leksikografisk = i samme rekkefølge de ville stått i et leksikon) Tabeller av tekster eller tall Vi må ha en algoritme (fremgangsmåte) for sortering Det finns mange metoder for sortering Dere skal lær den som er raskest når vi skal sortere få elementer, si < 50 elementer 19

Hvorfor sorterer vi For å få noen tall i sortert rekkefølge Eks: lotto-tallene Sortere tekster (navnelister) Sortere noen opplysninger som hører sammen. Sorterer da på en av opplysningene. Eks. Telefonkatalogen: navn, adresse, telefonnummer sortert på navn 20

Vi skal først lære å sortere heltall Dette skal vi så med minimale endringer bruke til åsortere: String-arrayer (tekster) 21

Vi ønsker en klasse med to varianter av sortering: Heltall og tekster public class ISort { public static void sorter(int [] a) { public static void sorter(string [] a) { // end class ISort 22

class TestInnstikkSortering { Test-program for sortering public static void main ( String[] args) { int [] a = {3,1,7,14,2,156,77; String [] navn = {"Ola", "Kari", "Arne", "Jo"; // sorter heltall - skriv ut ISort.sorter(a); for (int i = 0; i < a.length; i++) System.out.println( a[" + i +"]= " + a[i]); System.out.println("\n Test tekst-sortering:"); // sorter Stringer - skriv ut ISort.sorter(navn); for (int i = 0; i < navn.length; i++) System.out.println("navn[" + i +"]= " + navn[i]);

heltalls-array a 3 1 7 14 2 156 77 en-dimensjonal String-array "Ola "Kari "Arne "Jo" navn

>java InnstikkSortering a[0]= 3 a[1]= 1 a[2]= 7 a[3]= 14 a[4]= 2 a[5]= 156 a[6]= 77 Test av test-programmet med tomme sortering-metoder Test tekst-sortering: navn[0]= Ola navn[1]= Kari navn[2]= Arne navn[3]= Jo 25

En algoritme for å sortere heltall innstikksmetoden a 3 1 7 14 2 156 77 a Se på arrayen ett for ett element fra venstre mot høyre Sorterer det vi hittil har sett på, ved : Hvis det nye elementet vi ser på ikke er sortert i forhold til de vi allerede har sett på: Ta ut dette elementet (gjem verdien i en variabel t) Skyv på de andre elementene vi her sett på en-etter-en, ett hakk høyreover til elemetet i t kan settes ned på sortert plass. Da er den delen vi har sortert ett element lenger (fra venstre) Når vi har sett på alle elementene, er hele arrayen sortert Observasjon : Det første elementet er sortert i forhold til seg selv 26

Sorter 1 på plass i forhold til 3 steg 1 a 3 1 7 14 2 156 77 t 1 steg 2 3 3 7 14 2 156 77 a t 1 steg 3 1 3 7 14 2 156 77 a t 1

7 og 14 står riktig, Sorter 2 på plass i forhold til : 1,3,7,14 steg 4 1 3 7 14 2 156 77 a steg 5 1 3 7 14 2 156 77 a steg 6 1 3 7 14 2 156 77 a t 2 flytt: 14, 7 og så 3 ett hakk til høyre steg 7 1 3 3 7 14 156 77 a t 2 steg 8 1 2 3 7 14 156 77 a t 2

i k+1 Kode for å flytte ett element på plass : a 1 3 7 14 2 156 77 t 2 // a[k +1] står på // feil plass, ta den ut int t = a[k + 1], i = k; i a 1 3 7 14 156 77 3 t 2 k+1 // skyv a[i] mot høyre ett hakk til // vi finner riktig plass til t while (i >= 0 && a[i] > t) { a[i + 1] = a[i]; i--; a 1 2 3 7 14 156 77 t 2 // sett t inn på riktig plass a[i + 1] = t;

public class ISort { public static void sorter(int [] a) { for (int k = 0 ; k < a.length-1; k++) { if (a[k] > a[k+1]) { // a[k +1 ] står på feil plass, ta den ut int t = a[k + 1], i = k; // skyv a[i] mot høyre ett hakk til // vi finner riktig plass til t while (i >= 0 && a[i] > t) { a[i + 1] = a[i]; i--; // sett t inn på riktig plass a[i + 1] = t; // end heltall-sortering

>java InnstikkSortering a[0]= 1 Resultat av sortering med heltalls-metoden kodet, den andre uten kode a[1]= 2 a[2]= 3 a[3]= 7 a[4]= 14 a[5]= 77 a[6]= 156 Test tekst-sortering: navn[0]= Ola navn[1]= Kari navn[2]= Arne navn[3]= Jo

Sortering av tekster (String) "Ola "Kari "Arne "Jo" a Vi skal sortere denne ved å bytte om på pekerne (la a[0] peker på Arne,..osv) med innstikkmetoden 32

Sortere de to første elementene ved å bytte om pekere a t "Ola "Kari "Arne "Jo" t = a[1]; "Ola "Kari "Arne "Jo" a t a[1]= a[0]; "Ola "Kari "Arne "Jo" a t a[0]= t;

public static void sorter(int [] a) { // Sorterer heltallsarrayaen 'a'. for (int k = 0 ; k < a.length-1; k++) { if (a[k] > a[k+1]) { int t = a[k + 1]; int i = k; while (i >= 0 && a[i] > t) { a[i + 1] = a[i]; i--; a[i + 1] = t; // end heltall-sortering public static void sorter(string [] a) { // Sorterer String-arrayen 'a'. for (int k = 0 ; k < a.length-1; k++) { if( a[k].compareto(a[k+1]) > 0 ){ String t = a[k + 1]; int i = k; while (i >= 0 && ( a[i].compareto(t) > 0) ){ a[i + 1] = a[i]; i--; a[i + 1] = t; // end String-sortering String s = ; String t = ; s.compareto(t) returverdi < 0 hvis s er leksikografisk mindre enn t returverdi = 0 hvis s og t er tekstlig like returverdi > 0 hvis s er leksikografisk større enn t

>java InnstikkSortering a[0]= 1 a[1]= 2 Test med heltall og enkel String-sortering kodet a[2]= 3 a[3]= 7 a[4]= 14 a[5]= 77 a[6]= 156 Test tekst-sortering: navn[0]= Arne navn[1]= Jo navn[2]= Kari navn[3]= Ola

Javadoc proff dokumentasjon av klassene Legg inn spesielle kommentarer i programmet ditt (over hver metode og klasse) I disse kommentarene kan man legge HTMLkommandoer (som <br> for å få linjeskift) Kjør programmet javadoc, og automatisk har du en fin dokumentasjon Største fordel: Kode og dokumentasjon vedlikeholdes på samme fil. 36

/** * Klasse for sortering etter 'innstikk-metoden', se * Rett på Java - kap.5.7. * Sortering av heltallsarray, tekster og en to-dimensjonal * tekst-array sortert etter verdiene i første kolonne.<br> * * N.B. Bare velegnet for mindre enn 100 elementer. * * Copyright : A.Maus, Univ. i Oslo, 2008 **********************************************************/ public class ISort { /** * Sorterer heltall i stigende rekkefølge. * @param a heltallsarrayen som sorteres. <br> * Endrer parameter-arrayen. ********************************************/ public static void sorter(int [] a) { /** * Sorterer String-arrayer i stigende leksikografisk orden. * @param a arrayen som sorteres.<br> * Endrer parameter-arrayen ********************************************/ public static void sorter(string [] a) { // end class ISort

Dokumentasjon av klassen og metodene -javadoc M:\INF1000\Isort>javadoc package ISort.java Loading source file ISort.java... Constructing Javadoc information... Standard Doclet version 1.5.0_02 Building tree for all the packages and classes... Generating ISort.html... Generating package-frame.html... Generating package-summary.html... Generating package-tree.html... Generating constant-values.html... Building index for all the packages and classes... Generating overview-tree.html... Generating index-all.html... Generating deprecated-list.html... Building index for all classes... Generating allclasses-frame.html... Generating allclasses-noframe.html... Generating index.html... Generating help-doc.html... Generating stylesheet.css... M:\INF1000\Isort> 38