Inf1000 (Uke 10) HashMap og ArrayList

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Tabeller av objekter Klassen ArrayList
14 okt. 2003, Arne Maus Inst. for informatikk, UiO
C++ for Java-programmerere
Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Uke 8 - Mer om: Objekter, klasser og pekere
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon januar 2005 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Tabeller – Arrays Lage frekvenstabell Norske Bokstaver
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Objektorientert programmering i PHP del 2
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
IS-102 Klassedefinisjoner
Oblig4 - forklaringer Arne og Ole Christian.
Eiendomregister mars 2002 Arne Maus. import java.util.*; import inf101.*; /* Klasse med main() som starter hele programmet */ class EiendomsregisterMain.
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
En gang til!? .
Filer Finne minste Finne Største Beregne gjennomsnitt Variabler Tabeller – Arrays Lage frekvenstabell.
Feilhåndtering. Feil er uunngåelige! Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. For å få et godt.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 2.10 Default values – standardverdier ved oppstart MER OM: Sub-prosedyrer og sub-funksjoner.
Gjennomgang av prøven Tidsangivelse. Prøven deles ut Vi fyller ut øvelsen sammen.
INF150 Programmering mandag 11.9
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Objektorientert programmering
Repetisjon av JSP Variabler, tabeller, if-setninger, for/while-løkker
1 Arrayer og form(ularer) (Kapittel 4). 2 Mål  Forstå assosiative og superglobale arrays  Kunne behandle webformularer (forms)  Kjenne forskjellen.
Høgskolen i Oslo Webprogrammering Filbehandling i PHP.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Dynamiske nettsider PHP Del 1 – variable. PHP  PHP (Personal Home Page)  Fritt tilgjengelig programmeringsspråk  åpen kildekode  Plattformuavhengig.
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 3 Mer om uttrykk Terminal I/O Forgreninger
Java 11 Programmering med og uten objekter: hva er forskjellen?
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Programmering sif8005. Praktisk informasjon  Innleveringsfrist øvinger: mandag kl  Alle øvinger er obligatoriske  Studass tilgjengelig 6 timer.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
1 Java Database Connectivity (JDBC) Norvald H. Ryeng
INF1000 (Uke 14) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B.
INF1000 (Uke 13) Resten av eksamen H03 + del av V05 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild.
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Programmering i Java versjon september 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
Ekstra mange tips til Oblig 3! 12. mars 2007 Are Magnus Bruaset og Arild Waaler Inst. for informatikk, UiO.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
INF1000 (Uke 12) Sortering og eksamensoppgaver Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Anja B. Kristoffersen.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
MASTEROPPLEGG Kunstig intelligens Logikk
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
1 Inf1000 (Uke 10) Oppgaveløsning. Hashmap Programmering med og uten objekter: hva er forskjellen? Noen generelle råd vedrørende oppgaveløsing HashMap.
INF1000 (Uke 4) Mer om forgreninger, While-løkker
Inf1000 (Uke 5) Arrayer, filer og tekst
INF1000 (Uke 11) Programmering
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Repetisjon INF 1000 – våren 2007 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Anne Landro, Are Magnus Bruaset og Arild Waaler.
Registrering av testresultater fra mobiltelefon
Iterator i Java boolean hasNext() E next() void remove()
IN3030 – Effektiv parallellprogrammering Uke 1 2. del, våren 2019
Utskrift av presentasjonen:

Inf1000 (Uke 10) HashMap og ArrayList Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Are Magnus Bruaset og Anja Bråthen Kristoffersen

Bibliotekpakker i Java Mange pakker i java, som hver inneholder: klasser (In, Out, StringTokenizer, …) metoder (Math.random, outln, endOfFile, nextToken, …) evt. konstanter (Math.PI) Vi har hittil brukt metoder fra pakkene: easyIO.* java.util.* Math.* 27. mars 2006

Bibliotek Sun har laget en oversikt over alle tilgjengelige klasser og pakker i biblioteket: http://java.sun.com/j2se/1.4.2/docs/api/index.html For å hente inn de delene man trenger i programkoden fra biblioteket brukes import import java.util.* Vi skal i dag se på to av pakkene i java.util.* ArrayList HashMap 27. mars 2006

ArrayList Klassen ArrayList fungerer nesten som vanlige array-er. Vi må hente inn klassen fra biblioteket: import java.util.ArrayList; Objekter opprettes med new: ArrayList a = new ArrayList(); 27. mars 2006

ArrayList: innsetting av objekter Vi setter inn objekter med metoden add: a.add(p); //objektet p settes inn sist i listen a.add(n, p); //objektet p settes inn på indexplass n Vi får bare sette inn i posisjoner som er i bruk, eller én høyere! 27. mars 2006

ArrayList: oppslag i objekter Vi henter elementer med metoden get: p = (MyClass) a.get(n); Vi må angi klassen til det objektet vi henter ut her indikert med (MyClass) som kan være f.eks. (String) Antall elementer i ArrayList a får man med metoden size: int lengde = a.size(); 27. mars 2006

ArrayList sammenliknet med arrayer Fordeler Man behøver ikke anslå noen størrelse når man oppretter strukturen. ArrayList-objektet vil utvide seg selv automatisk ArrayList har noen flere operatorer, for eksempel for søking Ulemper ArrayList er mer kronglete å bruke 27. mars 2006

Problem Anta at vi ønsker å lage et program som leser inn linje for linje fra fil. Deretter skal programmet skrive ut linjene i motsatt rekkefølge. Vi lager først programmet ved bruk av vanlig array så ved bruk av ArrayList. 27. mars 2006

public static void main (String arg[]) { import easyIO.*; class Array1 { public static void main (String arg[]) { String line[] = new String[1000]; In file = new In(arg[0]); int nLines = 0; while (! file.endOfFile()){ line[nLines++] = file.inLine(); } file.close(); Out skjerm = new Out(); while (nLines > 0){ skjerm.outln(line[--nLines]); 27. mars 2006

import java.util.ArrayList; import easyIO.*; import java.util.ArrayList; class Array2 { public static void main (String arg[]) { ArrayList a = new ArrayList(); In file = new In(arg[0]); while (! file.endOfFile()){ a.add(file.inLine()); } file.close(); Out skjerm = new Out(); for (int i = a.size()-1; i >= 0; --i){ skjerm.outln((String) a.get(i)); 27. mars 2006

Oppsummering ArrayList Lengden av listen er ikke bestemt ved oppretting Objekter blir satt inn i listen sekvensielt, evt. skriver vi over andre objekter i listen For å hente ut objekter fra listen må klassen til objektet være kjent, samt posisjonen til objektet i listen Eksempel: (String) a.get(i); Listen kan bestå av forskjellige objekter 27. mars 2006

HashMap En HashMap er en form for tabell (i likhet med arrayer og ArrayLister) HashMap kan brukes til å holde orden på mange objekter. Dette er også kriterier for valg av struktur! 27. mars 2006

Forskjellen mellom array/ArrayList og HashMap I array/ArrayList: Legger vi inn objekter i en bestemt posisjon Må bruke denne posisjonen ved senere uthenting Indeksen er et heltall mellom 0 og (length-1) I HashMap: Må oppgi en bestemt nøkkel (vanligvis en tekststreng) når vi legger inn et nytt objekt Må oppgi samme nøkkel ved senere uthenting Indeksen er en tekststreng Dette er også kriterier for valg av struktur! 27. mars 2006

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 27. mars 2006

Å opprette en HashMap I starten av programmet: import java.util.*; Da importeres pakken java.util hvor bl.a. klassen HashMap ligger. I klassen eller metoden som skal bruke HashMap'en opprettes HashMap'en med: HashMap tabell = new HashMap(); Som for andre variable, 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 øverst (eller nesten øverst) inni denne metoden. 27. mars 2006

Å 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. tabell.put(nøkkel, objekt); Vi trenger denne nøkkelen dersom vi senere skal finne (eller fjerne) objektet i HashMap'en. MyClass x = (MyClass) tabell.get(nøkkel); 27. mars 2006

Å legge inn et objekt i en HashMap Det kan være fint å kunne bruke en tekst (en String) som nøkkel, f.eks. når: Finne data om en student ut fra hans eller hennes navn Finne data om en kommune ut fra kommunens navn. Finne en bil i et register ut fra bilnummeret Finne en CD i CD-arkivet ut fra tittelen på CD-en 27. mars 2006

Konstruksjon av nøkkel Noen ganger konstrueres en nøkkel ut fra flere variable: String lengdegrad = "67.3"; String breddegrad = "53.3"; String posisjon = lengdegrad + ";" + breddegrad; tabell.put(posisjon, målestasjon); 27. mars 2006

Å 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. 27. mars 2006

Å hente et objekt fra en HashMap HashMap'en ikke holder rede på hvilken klasse objektene som legges inn har Når objektene hentes ut må vi derfor fortelle Java hvilken klasse objektet har (egentlig et møte med en avansert mekanisme i objektorienterte språk som kalles arv, se INF1010). Merk: å hente et objekt fra en HashMap slik som over medfører ikke at objektet fjernes fra HashMap'en. 27. mars 2006

Overskriving av et objekt i en HashMap 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, p1 overskrives tabell.put(navn, p3); // p3 legges inn, p2 overskrives 27. mars 2006

Å 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. 27. mars 2006

Å 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(); <gjør noe med Person-objektet> } 27. mars 2006

To måter å løpe gjennom en HashMap Løpe gjennom verdiene (som på forrige foil): Iterator it = tabell.values().iterator(); while (it.hasNext()) { Person p = (Person) it.next(); <gjør noe med objektet> } Det man skal være oppmerksom på ved den første metoden er at selv om et objekt ligger to steder i tabellen (kan skje), så vil oppramsingen bare ta det med en gang. 27. mars 2006

To måter å løpe gjennom en HashMap Løpe gjennom nøklene: Iterator it = tabell.keySet().iterator(); while (it.hasNext()) { String nøkkel = (String) it.next(); <gjør noe med nøkkelen> } Det man skal være oppmerksom på ved den første metoden er at selv om et objekt ligger to steder i tabellen (kan skje), så vil oppramsingen bare ta det med en gang. 27. mars 2006

Metoder i HashMap Metode Eksempel Beskrivelse 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 Når vi legger et objekt inn i en hash-tabellmed en bestemt nøkkel, kan det være at det allerede ligger et objekt med den nøkkel der fra før. Da får vi det i retur. Legg merke til at de tre første metodene returnerer en peker til den mest generelle klassen av alle klasser, nemlig Object. For å få til å snakke om andre objekter som vi mener å ha lagret i Hashmap-en må vi lage en ny forståelse – cast-e – dette objektet til den klassen vi tror det er. 27. mars 2006

Skal vi bruke array, ArrayList eller HashMap? kan lagre et på forhånd spesifisert antall verdier eller objekter hver tabell kan bare lagre verdier av én type ArrayList: kan lagre et uspesifisert antall objekter kan lagre objekter av ulik klasse kan sette inn og fjerne objekter HashMap: 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 27. mars 2006

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. 27. mars 2006

public static void main (String [] args) { 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); 27. mars 2006

Eksempel: ELIZA - den elektroniske psykiater 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: 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 27. mars 2006

En samtalepartner Vi skal nå lage et program som basert på en eksisterende assosiasjonsliste gjør det mulig å "snakke med maskinen", slik at hver gang maskinen gjenkjenner et ord gir den et bestemt (og tilnærmet fornuftig) svar. Det første programmet gjør er å gå i løkke for å lese inn assosiasjonslisten ”assosiasjoner.txt”. Den blir lagt inn i en HashMap med assosiasjonsordet som nøkkel. Deretter skal programmet gå i løkke og be brukeren skrive noe, hvoretter programmet skriver ut tilhørende svar (hvis et av ordene brukeren skriver er registrert i assosiasjoner.txt). 27. mars 2006

assosiasjoner.txt mat Liker du pizza? pizza Jeg liker ikke pizza. sulten Det er viktig å få i seg nok mat. hallo Heisan. hei Hei du. Fortell hvorfor du er kommet til meg. morn Morn du. Hva kan jeg hjelpe deg med. heisan God formiddag, og hva er ditt problem … 27. mars 2006

Program skisse import easyIO.* import java.util.* class Eliza1 { main() } class Psykiater { HashMap h = new HashMap(); In tast = new In(); Out skjerm = new Out(); void lesFraFil() { //her skal vi lese dataene fra filen assosiasjoner.txt og lagre dem i en HashMap void samtale() { // her skal vi lese inn tekst fra skjermen og lete gjennom HashMap-en etter respons 27. mars 2006

Metoden lesFraFil() void lesFraFil() { In innfil = new In("assosiasjoner.txt"); // åpner filen for lesing while (!innfil.lastItem()) { // sjekker om det er mer igjen å lese på filen String s1 = innfil.inWord(); // leser inn assosiasjonsordet (nøkkelen) String s2 = innfil.inLine(); // leser inn responsen h.put(s1, s2); // lagrer responsen med assosiasjonsordet som nøkkel } innfil.close(); // lukker assosiasjoner.txt 27. mars 2006

Skisse til metoden samtale() void samtale() { // be om respons fra bruker og les inn fra skjerm while(!avslutt){ // Hvis ikke brukeren vil avslutte les inn setningen // For hver setning trenger vi å dele den opp i ord, teste om ordet er en nøkkel i h // Vi lager en klasse Setning med metodene flereOrd() og nesteOrd(). // Gå i løkke gjennom hvert ord i setningen, for første ord i setningen som er en // nøkkel i h les responsen og skriv den ut på skjermen // Hvis ingen ord i setningen er nøkkel i h, be brukeren utdype svaret // Les inn nytt svar } 27. mars 2006

Klassen Setning class Setning { String s; Setning(String t) { s = t + " "; // legger et ekstra mellomrom etter setningen } boolean flereOrd() { while (s.length() > 0 && s.charAt(0) == ' ') { s = s.substring(1); // leser over mellomrom return (s.length() > 0); // returnerer false når det ikke er flere ord i setningen String nesteOrd() { int k = s.indexOf(' '); // leser lengden til neste mellomrom String t = s.substring(0, k); // leser neste ord s = s.substring(k); // tar vare på resten av setningen i s return t; 27. mars 2006

Metoden samtale() void samtale() { skjerm.outln("Hei, jeg er din psykiater. Jeg skal prøve å hjelpe deg."); skjerm.outln("For å avslutte, skriv 'avslutt'"); skjerm.out(">"); String svar = tast.inWord("\n"); // leser inn fra skjerm til linjeskift while (!svar.equals("avslutt")) { Setning set = new Setning(svar); // lager objekt av klassen Setning boolean funnet = false; // initialiserer den boolske variabelen funnet while(set.flereOrd() && !funnet) { String ord = set.nesteOrd(); // leser neste ord i setningen if (h.containsKey(ord)) { // sjekker om ordet er en nøkkel i h String respons = (String) h.get(ord); // hvis nøkkel leser respons funnet = true; skjerm.outln(respons); } if (!funnet) { skjerm.outln("Fortell mer!"); svar = tast.inWord("\n"); 27. mars 2006

Klassen Eliza1 med main metoden. import easyIO.*; import java.util.*; class Eliza1 { public static void main (String[] args) { Psykiater psy = new Psykiater(); psy.lesFraFil(); psy.samtale(); } 27. mars 2006

Programeksempler på nettsiden På kursets hjemmeside finner du et større programeksempel som illustrerer bruk av HashMap 27. mars 2006