// Dette er et eksempel p? et st?rre program (Java 1.5) som viser bruken av HashMaps og Arraylists. // Nils Petter Wien - Institutt for informatikk. //java.util trengs til HashMap og arraylist import easyIO.*; import java.util.*; class HashEksempel { public static void main(String[] args) { Klasseliste liste = new Klasseliste(); liste.ordreL?kke(); } } //slutt klassen hashmap class Klasseliste { //brukes til ? lese fra tastatur In tastatur = new In(); //peker Elev e; //to HashMaps - brukes med forskjellige nokler (den forste navn, den andre adresse) HashMap elever = new HashMap(); HashMap eleverMedAdr = new HashMap(); void ordreL?kke() { int valg; do { valg= skrivMeny(); switch (valg) { case 1: System.out.println("Tast 1 for ? lese inn registeret"); hentElevFraFil(); break; case 2: System.out.println("Tast 2 for ? registrere en ny elev"); registrerElev(); break; case 3: fjernElev(); break; case 4: skrivListe(); break; case 5: skrivTilFil(); break; case 6: System.out.println("Du har valgt ? avslutte programmet, ha en fin dag!"); break; default: System.out.println("Feil valg, tast et tall mellom 1 og 6"); break; } //slutt switch }while(valg !=6); } //slutt ordreL?kke int skrivMeny() { int valg; System.out.println("Tast 1 for ? lese inn registeret"); System.out.println("Tast 2 for ? registrere en ny elev"); System.out.println("Tast 3 for ? fjerne en elev"); System.out.println("Tast 4 for ? skrive liste over elevene"); System.out.println("Tast 5 for ? skrive til fil"); System.out.println("Tast 6 for ? avslutte programmet"); valg= tastatur.inInt(); tastatur.readLine(); return valg; } //slutt skrivMeny() void registrerElev() { //forutsetter at b?de adresse og fullt navn er unikt String navn; System.out.println("Ah, du husker en ny elev, s? fint!"); System.out.println("Tast inn navnet til vedkommende"); navn=tastatur.readLine(); e= new Elev(navn); //Som man ser, brukes den samme pekeren (til samme objektet) i begge hashmapene. //Dette gir muligheter til ? s?ke p? forskjellige m?ter - her navn eller adresse. elever.put(e.hentNavn(), e); eleverMedAdr.put(e.hentAdr(), e); } //slutt registrerElev() void hentElevFraFil() { //Denne metoden vil i det i de fleste tilfellene v?re naturlig ? kalle opp automatisk i det man starter opp programmet. String linje; //brukes til ? lese fra fil In innfil= new In("elever.txt"); System.out.println("Henter data fra fil"); /* l?kke som leser hver linje helt til slutten av filen, * lager objekter av elevene, og s? legger inn navn og adresse som * s?kefelt i de to hashmapsene */ while(!innfil.endOfFile()) { e= new Elev(innfil); elever.put(e.hentNavn(), e); eleverMedAdr.put(e.hentAdr(), e); } } //slutt hentElevFraFil void skrivListe() { Iterator liste = elever.values().iterator(); System.out.println("Her er alle de registrerte elevene"); //g?r igjennom HashMapen og kaller p? objektets utskriftsmetode while(liste.hasNext()) { e= liste.next(); e.utskrift(); } //slutt while } //slutt skrivListe /* Denne metoden kunne ogs? v?rt skrevet slik: void skrivListe() { for (Elev e: elever.values()) { e.utskrift(); } } //slutt alternativ skrivListe() */ //Denne metoden ville man normalt ha kalt automatisk i det man avslutter programmet. void skrivTilFil() { Out utfil= new Out("elever.txt"); Iterator liste = elever.values().iterator(); System.out.println("Skriver data til fil"); //g?r igjennom hashmapen og kaller p? objektets utskriftsmetode while(liste.hasNext()) { e= (Elev) liste.next(); e.skrivTilFil(utfil); } //slutt while //lukker filen (trengs for ? lagre dataene) utfil.close(); } //slutt skrivTilFil void fjernElev() { String navn; String adr; String valg; System.out.println("Du vil fjerne en elev?\n Hvilken info har du - navn (n) eller adressen (a)?"); valg=tastatur.inWord(); tastatur.readLine(); if (valg.toUpperCase().equals("N")) { System.out.println("Hva er navnet til vedkommende?"); navn=tastatur.inLine(); if (! elever.containsKey(navn)) { System.out.println("Personen: "+navn+" eksisterer ikke i basen"); } else { e= elever.get(navn); adr=e.hentAdr(); elever.remove(navn); eleverMedAdr.remove(adr); System.out.println("Personen: "+navn+" er fjernet fra basen"); }//slutt else } //slutt hvis navn else if (valg.toUpperCase().equals("A")) { System.out.println("Hva er adressen til vedkommende du onsker aa fjerne?"); adr=tastatur.inLine(); if (! eleverMedAdr.containsKey(adr)) System.out.println("Personen som bor i: "+adr+" eksisterer ikke i basen"); else { e= eleverMedAdr.get(adr); navn=e.hentNavn(); elever.remove(navn); eleverMedAdr.remove(adr); System.out.println("Personen: som bor i "+adr+" er fjernet fra basen"); } } //slutt hvis adresse else System.out.println("Feil valg, tast A for adresse eller N for navn"); }//slutt fjernElev() }//slutt Klasseliste class Elev { //Husk ? deklarere objektets variable som private. //Dette hindrer "tukling" med andres variable. private String navn; private String adresse; private int telefonnummer; //Bruker en arraylist til ? registrere personens telefonnummere (ukjent antall) ArrayList alleTelefonnumre = new ArrayList(); Telefonnr tlf; In tast= new In(); Elev(In innfil) { String linje; StringTokenizer st; String telefonLinje; linje=innfil.inLine(); /* lager en StringTokenizer(klasse som bearbeider tekster), bruker ; som skilletegn) Kunne selvsagt benyttet oss av easyIO sin separatorfunksjon (som ble brukt i oblig 2 og 3), men velger alts? ? vise frem StringTokenizer som et alternativ. */ st = new StringTokenizer(linje, ";"); navn=st.nextToken(); adresse=st.nextToken(); //sjekker om det er registrert noen telefonnumre if (st.hasMoreTokens()) { //kopierer telefonnumrene til en egen linje telefonLinje=st.nextToken(); //lager en ny tokenizer av telefonnumrene, adskilt av blank st=new StringTokenizer(telefonLinje); //brukes til ? lagre telefonnumrene inn i arraylisten while(st.hasMoreTokens()) //alts? s?lenge det er mer i linjen { telefonnummer=Integer.parseInt(st.nextToken()); tlf = new Telefonnr(telefonnummer); alleTelefonnumre.add(tlf); } //slutt while } //slutt if (st.hasMoreTokens()) } //slutt konstrukt?r som leser fra fil //Konstrukt?r som brukes til ? lese fra tastatur. //Husk flere metoder kan hete det samme s?fremt de har ulike paramtere. //Dette kalles overlasting av metoder, og er beskrevet i l?rebokens avsnitt 10.3 Elev(String n) { navn=n; System.out.println("Tast inn adressen:"); adresse=tast.readLine(); do { System.out.println("Tast inn telefonnummeret, 0 for ? avslutte"); telefonnummer=tast.inInt(); if (telefonnummer !=0) { tlf = new Telefonnr(telefonnummer); alleTelefonnumre.add(tlf); } } while (telefonnummer !=0); } //slutt konstrukt?r //hjelpemetoder som returnerer objektets navn og adresse(husk navn&adr er private) String hentNavn() { return navn; } String hentAdr() { return adresse; } void utskrift() { System.out.println("Navnet er: "+navn); System.out.println("Å·ÖÞ±­ÔÚÏßÂòÇò_Å·ÖÞ±­Í¶×¢ÍøÕ¾ÍƼö@n er: "+adresse); if (alleTelefonnumre.size()==0) System.out.println("Personen: "+navn+" har ikke telefon"); else { System.out.println("Telefonnumrene er:" ); for(int i=0;i