public int finnMestNyttigVerdi(Produkt produkt)
Eksempel: Nyttige Ikke-nyttige
* Anmeldelse 1: 9 11
* Anmeldelse 2: 8 7
* Anmeldelse 3: 8 6
* Anmeldelse 4: 8 10
* Anmeldelse 5: 7 5
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
/** Klasse som representerer en avdeling. */
class Avdeling {
/** Tegn som markerer slutt på et felt med data. */
public final static char FELT_SLUTT_TEGN = '|';
/** Navn på denne avdelingen */
private String avdNavn;
/** Tabell som inneholder produkter for denne avdelingen */
private Produkt[] produkter;
/** Antall produkter i denne avdelingen */
private int antallProdukter;
/**
* Konstruktør for å initialisere en avdeling.
* @param avdNavn Navn på denne avdelingen.
* @param maksAntallProdukter Maks antall produkter som kan tilhøre
* denne avdelingen. */
public Avdeling(String avdNavn, int maksAntallProdukter) {
this.avdNavn = avdNavn;
this.produkter = new Produkt[maksAntallProdukter];
this.antallProdukter = 0;
}
/** @return navn på denne avdelingen. */
public String hentAvdNavn() { return this.avdNavn; }
/** @return antall produkter i denne avdelingen. */
public int hentAntallProdukter() { return this.antallProdukter; }
/**
* @return totalt antall anmeldelser for alle produkter i denne avdelingen */
public int finnTotaltAntallAnmeldelser1() {
int totaltAntall = 0;
for (int i = 0; i < antallProdukter; ++i) {
totaltAntall += produkter[i].hentAntallAnmeldelser();
}
return totaltAntall;
}
/** @return produkt angitt ved indeks, null dersom indeks er ulovlig
* @param indeks Produkt angitt ved indeks i produkttabellen skal returneres */
public Produkt hentProdukt(int indeks) {
Produkt produkt = null;
if (0 <= indeks && indeks <= antallProdukter)
produkt = produkter[indeks];
return produkt;
}
/** Finner indeks til angitt produkt i denne avdelingen.
* @param produkt som indeks i produkttabellen skal finnes.
* @return indeks til angitt produkt dersom det ble funnet, -1 ellers. */
public int finnProduktIndeks(Produkt produkt) {
return HjelpeKlasse.finnNøkkel(produkter, antallProdukter, produkt);
}
/**
* Innsetter et produkt i produkttabellen, dersom (a) det er plass i
* produkttabellen, (b) produkt ikke er null og (c) ikke finnes fra før
* i produkttabellen.
* @param produkt som skal forsøkes innsatt i produkttabellen.
* @return true dersom angitt produkt ble innsatt, false ellers. */
public boolean innsettProdukt(Produkt produkt) {
// Skriv kode for denne metoden
boolean ok = this.antallProdukter < produkter.length && produkt != null
&& finnProduktIndeks(produkt) < 0;
if (ok) {
System.out.println("Setter inn " + produkt.hentProduktNavn());
produkter[this.antallProdukter++] = produkt;
}
return ok;
}
/**
* En anmeldelse er mest-nyttig for et produkt dersom den har
* største antall nyttige stemmer som er større eller lik
* de tilsvarende ikke-nyttige stemmene.
* Eksempel: Nyttige Ikke-nyttige
* Anmeldelse 1: 9 11
* Anmeldelse 2: 8 7
* Anmeldelse 3: 8 6
* Anmeldelse 4: 8 10
* Anmeldelse 5: 7 5
* I eksempelet ovenfor, er anmeldelsene 2 og 3 de mest-nyttige i følge
* definisjonen ovenfor, og antall nyttige stemmer til de mest-nyttige
* anmeldelsene er 8, dvs mest-nyttig verdi er 8.
* Legg merke til at anmeldelse 4 er ikke en mest-nyttig anmeldelse.
* @param produkt som skal legges til grunn for å finne
* de mest-nyttige anmeldelsene.
* @return antall nyttige stemmer til de mest-nyttige anmeldelsene. */
public int finnMestNyttigVerdi(Produkt produkt) {
/**
* Skriver ut på skjerm alle de mest-nyttige anmeldelsene til et produkt.
* Se forklaring for metoden finnMestNyttigVerdi(produkt).
* Det kan hende at et produkt ikke har noe mest-nyttige anmeldelser.
* Merk også at de/den mest-nyttige stemmen/e må være større eller lik
* de tilsvarende ikke-nyttige stemmene.
* @param produkt som de mest-nyttige anmeldelsene skal skrives ut for. */
public void skrivMestNyttigeAnmeldelser(Produkt produkt) {
/**
* Skriver alle anmeldelser for alle produkter i denne avdelingen
* til en tekstfil.
* Den første linjen i filen skal inneholde navn på avdelingen.
* Den andre linjen i filen skal inneholde hvor mange anmeldelser det er
* totalt i avdelingen.
* SÃ¥ skrives ut en post per linje som inneholder opplysninger om
* en anmeldelse, på følgende format:
* <produkt navn>|<antall stjerner>|<antall nyttige>|<antall ikke-nyttige>|<anmeldelsestekst>
* Feltsluttegnet er angitt ved konstanten FELT_SLUTT_TEGN.
* Alle relevante io-unntak blir behandlet i metoden og passende melding
* blir skrevet til skjermen.
* @param filnavn Navnet på filen det skal skrives til
* @return true hvis filskriving gikk bra, false ellers */
public boolean skrivAlleAnmeldelserTilFil(String filnavn) {
try {
FileWriter tekstFilSkriver = new FileWriter (filnavn);
PrintWriter tekstSkriver = new PrintWriter (tekstFilSkriver);
tekstSkriver.println(produkt);
tekstSkriver.println(antallStjerner);
tekstSkriver.println(antallNyttige);
tekstSkriver.println(antallIkkeNyttige);
for(int i = 0; i<antalIkkeNyttige; i++)
tekstSkriver.println(anmeldelse[i].hentProdukt()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallStjerner()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallNyttige()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallIkkeNyttige()+Anmeldelse.FELT_SLUTT_TEGN
tekstSkriver.close();
return true;
} catch (IOException unntak) {
System.out.println("Filhåndteringsfeil ved skriving til " + filnavn);
return false;
}
}
/**
* Gitt en post som angir opplysninger om en anmeldelse, returnerer metoden
* produktet anmeldelsen gjelder.
* Metoden konstruerer et produkt fra angitt post, der det første feltet
* angir produktnavn, og kontrollerer om produktet finnes fra før
* i produkttabellen (se metoden finnProduktIndeks(produkt)).
* Dersom det ikke finnes, blir det innsatt i produkttabellen
* hvis det er plass (se metoden innsettProdukt(produkt)).
* @param post fra fil for en anmeldelse, der første felt er produktnavn.
* @return produktet som anmeldelsen gjelder,
* null dersom det ikke kan innsettes i produkttabellen. */
private Produkt innsettProduktFraPost(String post) {
}
/**
* Gitt en post som angir opplysninger om en anmeldelse, bestemmer metoden
* anmeldelsen.
* Hver post for en anmeldelse har følgende format:
* <produktnavn>|<antall stjerner>|<antall nyttige>|<antall ikke-nyttige>|<anmeldelsestekst>
* Feltsluttegnet er angitt ved konstanten FELT_SLUTT_TEGN.
* Metoden konstruerer en ameldelse fra angitt post, og kontrollerer om
* anmeldelsen finnes fra før i anmeldelsestabellen for angitt produkt
* (se metoden Produkt.finnAnmeldelseIndeks(anmeldelse)).
* Dersom det ikke finnes, blir det innsatt i anmeldelsestabellen for
* angitt produkt, avhengig av om det er plass
* (se metoden Produkt.innsettAnmeldelse(anmeldelse)).
* Nyttige og ikke-nyttige stemmer fra posten blir lagt till anmeldelsen.
* Metoden håndterer formmateringsunntak og skriver passende melding.
* Metoden kontrollerer at antall stjerner som er angitt er lovlig,
* dvs. [0, Anmeldelse.MAKS_ANTALL_STJERNER].
* @param produktet som anmeldelsen gjelder.
* @param post fra fil med opplysninger om en anmeldelse.
* @return anmeldelsen som blir bestemt, null dersom dette ikke er mulig. */
private Anmeldelse innsettAnmeldelseFraPost(Produkt produkt, String post) {
}
/**
* Tolker en post med anmeldelsesopplysninger.
* Anta at hver post har riktig antall felt-verdier.
* Denne metoden benytter seg av metoden innsettProduktFraPost(post)
* for å bestemme produktet og benytter seg av metoden
* innsettAnmeldelseFraPost(produkt, post) for å bestemme anmeldelsen.
* Metoden skriver passende meldinger dersom det er problemer med å innsette
* enten produktet eller anmeldelsen.
* @param post Posten som skal tolkes.
* @return true dersom posten ble tolket riktig, false ellers. */
private boolean innsettPost(String post) {
int feltsluttIndeks1 = post.indexOf(FELT_SLUTT_TEGN);
int feltsluttIndeks2 = post.indexOf(FELT_SLUTT_TEGN, feltsluttIndeks1 + 1);
String anmeldelse = post.substring (0, feltsluttIndeks1);
}
/**
* Leser alle poster med opplysninger om anmeldelser fra en tekstfil.
* Metoden kontrollerer om navn på avdelingen fra filen er det samme
* som denne avdelingen.
* Metoden kontrollerer at antall anmeldelser er spesifisert riktig.
* Anta at filen har riktig antall poster.
* Meoden kaller metoden innsettPost(post) for håndteringen av posten.
* Metoden håndterer alle unntak angående formatering av tall,
* om filen finnes, og lesing gikk riktig for seg.
* Metoden avbryter dersom det oppstår problemer.
* @param filnavn Navnet på filen det skal leses fra
* @return true hvis fillesing gikk bra, false ellers */
public boolean lesAnmeldelserFraFil(String filnavn) {
try {
FileReader tekstFilLeser = new FileReader(filnavn);
BufferedReader tekstLeser = new BufferedReader(tekstFilLeser);
String antallStreng = tekstLeser.readLine();
int antallFraFil = Integer.parseInt(antallStreng);
boolean lesOk = true;
for (int i=0; i<antallFraFil && lesOk; i++) {
String post = tekstLeser.readLine();
innsettPost(post);
}
tekstLeser.close();
return lesOk;
} catch (IOException ioUnntak) {
System.out.println("Feil ved lesing fra " + filnavn);
}
return false;
}
/** Sammenligner to avdelinger for likhet. To avdelinger er like dersom de har samme navn.
* @param obj den andre avdelingen som dette objektet skal sammenlignes med.
* @return true dersom de to avdelingene er like, false ellers. */
public boolean equals(Object obj) {
if (this == obj) { return true; }
if (!(obj instanceof Avdeling)) { return false; }
Avdeling avdeling = (Avdeling) obj;
return this.avdNavn.equals(avdeling.avdNavn);
}
/** @return Strengrepresentasjon av denne avdelingen på følgende format:
* <avdelingsnavn> har <antall produkter> produkter som til sammen har fått
* <totalt antall anmeldelser> anmeldelse(r).
* Eksempel:
* Avdelingen Bøker har 3 produkter som til sammen har fått 8 anmeldelse(r).
*/
public String toString() {
return String.format("Avdelingen %s har %d produkter som til sammen har fått %d anmeldelse(r).",
this.avdNavn, this.antallProdukter, this.finnTotaltAntallAnmeldelser1());
}
}
/** Klassen som representerer en anmeldelse. */
public class Anmeldelse {
/** Maks antall stjerner som en anmeldelse kan få. */
public final static int MAKS_ANTALL_STJERNER = 5;
/** Produktet denne anmeldelsen gjelder. */
private Produkt produkt;
/** Tekst for anmeldelsen. */
private String anmeldelseTekst;
/** Antall stjerner som denne anmeldelsen har fått tildelt. */
private int antallStjerner;
/** Leser-stemmer som mener at denne anmeldelsen er nyttig.*/
private int antallNyttige;
/** Leser-stemmer som mener at denne anmeldelsen er ikke nyttig. */
private int antallIkkeNyttige;
/** Konstruktør for å initialisere en anmeldelse.
* @param produkt Produktet denne anmeldelsen gjelder.
* @param anmeldelseTekst Tekst for anmeldelsen.
* @param antallStjerner Antall stjerner tildelt denne anmeldelsen. */
public Anmeldelse(Produkt produkt, String anmeldelseTekst, int antallStjerner) {
this.produkt = produkt;
this.anmeldelseTekst = anmeldelseTekst;
this.antallStjerner = antallStjerner;
this.antallNyttige = 0;
this.antallIkkeNyttige = 0;
}
/** @return Produktet som denne anmeldelsen gjelder. */
public Produkt hentProdukt() { return produkt; }
/**@return Tekst for denne anmeldelsen. */
public String hentAnmeldelseTekst() { return anmeldelseTekst; }
/** @return Antall stjerner tildelt denne anmeldelsen. */
public int hentAntallStjerner() { return antallStjerner; }
/** @return Antall nyttige leser-stemmer for denne anmeldelsen. */
public int hentAntallNyttige() { return antallNyttige; }
/** @return Antall ikke-nyttige leser-stemmer for denne anmeldelsen. */
public int hentAntallIkkeNyttige() { return antallIkkeNyttige; }
/** Legger til angitt antall nyttige leser-stemmer.
* @param antall Antall leser-stemmer som skal legges til nyttige
* stemmer for denne anmeldelsen. */
public void leggTilNyttige(int antall) {
this.antallNyttige += antall;
}
/** Legger til antall ikke-nyttige leser-stemmer.
* @param antall Antall leser-stemmer som skal legges til ikke-nyttige
* stemmer for denne anmeldelsen. */
public void leggTilIkkeNyttige(int antall) {
this.antallIkkeNyttige += antall;
}
/**
* Sammenligner to anmeldelser for likhet.
* To anmeldelser er like dersom de (a) gjelder samme produkt, (b) har lik
* anmeldelsestekst og (c) har fått likt antall stjerner.
* @param obj den andre anmeldelsen
* @return true dersom de to ameldelsene er like, false ellers. */
public boolean equals(Object obj) {
if (this == obj) { return true; }
if (!(obj instanceof Anmeldelse)) { return false; }
Anmeldelse anmeldelse = (Anmeldelse)obj;
return this.produkt.equals(anmeldelse.produkt)
&& this.anmeldelseTekst.equals(anmeldelse.anmeldelseTekst)
&& this.antallStjerner == anmeldelse.antallStjerner ;
}
/**
* @return Strengrepresentasjon av denne anmeldelsen følgende format:
* <anmeldelsetekst> <streng med antall '*'> (Nyttige: <antall nyttige>,
* Ikke-nyttige: <antall ikke-nyttige>)
* Eksempel: Knakende god! **** (Nyttige: 8, Ikke nyttige: 7) */
public String toString() {
return String.format("%30s %-5s (Nyttige: %2d, Ikke-nyttige: %2d)",
this.anmeldelseTekst, HjelpeKlasse.fyllStreng(this.antallStjerner, '*'),
this.antallNyttige, this.antallIkkeNyttige);
}
}
/** Klasse med nyttige metoder. */
public class HjelpeKlasse {
/**
* Fyller en streng med et gitt tegn.
* @param antallTegn Angir hvor mange tegn som skal være i strengen
* @param tegn Angir tegn som strengen skal fylles med
* @return streng fylt med angitt tegnet visst antall ganger.*/
public static String fyllStreng(int antallTegn, char tegn) {
String fylleMed = Character.toString(tegn);
String stjStr = "";
for (int i = 0; i < antallTegn; ++i) {
stjStr += fylleMed;
}
return stjStr;
}
/**
* Lineær søking etter en nøkkel.
* @param tab Tabellen det skal søkes i
* @param antall Antall elementer i tabellen
* @param nøkkel Verdi det skal søkes etter i tabellen
* @return indeks i tabellen der nøkkel ble funnet, ellers -1.
*/
public static int finnNøkkel(Object[] tab, int antall, Object nøkkel){
int indeks;
for (indeks = 0; indeks < antall && !tab[indeks].equals(nøkkel); ++indeks);
if (indeks >= antall) {
indeks = -1;
}
return indeks;
}
}
/** Klassen som representerer en forenklet nettbutikk. */
public class Nettbutikk {
public static void main(String[] args) {
// Opprett en bokavdeling med 500 bøker
Avdeling bokAvdeling = new Avdeling("Bokavdeling", 500);
// ok bestemmer om data skal leses fra fil eller ikke.
boolean ok = false;
if (ok) {
init(bokAvdeling);
} else {
System.out.println(
"LESER ANMELDELSER FOR PRODUKTER I BOKAVDELINGEN FRA FIL.");
ok = bokAvdeling.lesAnmeldelserFraFil("bokavd.txt");
}
if (!ok) {
System.out.println("Fillesing avbrutt.");
return;
} else {
System.out.println("Fillesing ok.\n");
}
System.out.println(bokAvdeling);
System.out.println("OVERSIKT OVER PRODUKTER OG DERES ANMELDELSER I BOKAVDELINGEN:");
for (int i = 0; i < bokAvdeling.hentAntallProdukter(); ++i) {
Produkt produkt = bokAvdeling.hentProdukt(i);
System.out.println(produkt);
int antallAnmeldelser = produkt.hentAntallAnmeldelser();
for (int j = 0; j < antallAnmeldelser; ++j) {
Anmeldelse anmeldelse = produkt.hentAnmeldelse(j);
System.out.println(anmeldelse);
}
System.out.println();
}
System.out.println("HISTORGRAM OVER ANTALL STJERNER-HYPPIGHET TIL "
+ "ANMELDELSER FOR HVERT PRODUKT I BOKAVDELINGEN:");
for (int i = 0; i < bokAvdeling.hentAntallProdukter(); ++i) {
Produkt bok = bokAvdeling.hentProdukt(i);
System.out.println(bok);
bok.skrivHistogram();
System.out.println();
}
System.out.println("MEST-NYTTIGE ANMELDELSER FOR ET PRODUKT I BOKAVDELINGEN:");
// Mest-nyttige anmeldelser for produkt med navn "Java Jumpstart".
bokAvdeling.skrivMestNyttigeAnmeldelser(bokAvdeling.hentProdukt(0));
System.out.println("\nSKRIVER ALLE ANMELDELSER FOR ALLE PRODUKTER I BOKAVDELINGEN TIL FIL.");
ok = bokAvdeling.skrivAlleAnmeldelserTilFil("bokavd-utdata.txt");
if (!ok) {
System.out.println("Filskriving avbrutt.");
} else {
System.out.println("Filskriving ok.");
}
}
// METODEN IKKE BRUKT
private static void init(Avdeling bokAvdeling) {
// 1. bok med 5 anmeldelser
Produkt bok = new Produkt("Java Jumpstart", bokAvdeling);
bokAvdeling.innsettProdukt(bok);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Grådig god. Løp og kjøp!", 5));
Anmeldelse anmeldelse = bokAvdeling.hentProdukt(0).hentAnmeldelse(0);
anmeldelse.leggTilNyttige(9);
anmeldelse.leggTilIkkeNyttige(11);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Knakende god!", 4));
anmeldelse = bokAvdeling.hentProdukt(0).hentAnmeldelse(1);
anmeldelse.leggTilNyttige(8);
anmeldelse.leggTilIkkeNyttige(7);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Spennende!", 4));
anmeldelse = bokAvdeling.hentProdukt(0).hentAnmeldelse(2);
anmeldelse.leggTilNyttige(8);
anmeldelse.leggTilIkkeNyttige(6);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Anbefales!", 3));
anmeldelse = bokAvdeling.hentProdukt(0).hentAnmeldelse(3);
anmeldelse.leggTilNyttige(8);
anmeldelse.leggTilIkkeNyttige(10);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Vanskelig men god bok.", 3));
anmeldelse = bokAvdeling.hentProdukt(0).hentAnmeldelse(4);
anmeldelse.leggTilNyttige(7);
anmeldelse.leggTilIkkeNyttige(5);
// 2. bok med 2 anmeldelser
bok = new Produkt("Java på 5 min.", bokAvdeling);
bokAvdeling.innsettProdukt(bok);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Styr unna!", 1));
anmeldelse = bokAvdeling.hentProdukt(1).hentAnmeldelse(0);
anmeldelse.leggTilNyttige(2);
anmeldelse.leggTilIkkeNyttige(4);
bok.innsettAnmeldelse(new Anmeldelse(bok, "Har ingen kodeeksempler!", 2));
anmeldelse = bokAvdeling.hentProdukt(1).hentAnmeldelse(1);
anmeldelse.leggTilNyttige(4);
anmeldelse.leggTilIkkeNyttige(6);
// 3. bok med 1 anmeldelse
bok = new Produkt("Jambo Java", bokAvdeling);
bokAvdeling.innsettProdukt(bok);
bok.innsettAnmeldelse(new Anmeldelse(bok,"Den er jo på swahili! Kult!",5));
anmeldelse = bokAvdeling.hentProdukt(2).hentAnmeldelse(0);
anmeldelse.leggTilNyttige(3);
anmeldelse.leggTilIkkeNyttige(7);
}
}
/** Klassen som representerer et produkt. */
public class Produkt {
/** Maks antall anmeldelser som et produkt kan få. */
public final int MAKS_ANTALL_ANMELDELSER = 100;
/** Navn på dette produktet. */
private String prodNavn;
/** Avdelingen dette produktet tilhører. */
private Avdeling avdeling;
/** Tabell som inneholder anmeldelser for dette produktet. */
private Anmeldelse[] anmeldelser;
/** Teller som angir hvor mange anmeldelser dette produktet har fått. */
private int antallAnmeldelser;
/** Konstruktør for å initialisere et produkt.
* @param prodNavn Navn på dette produktet.
* @param avdeling Avdelingen dette produktet tilhører. */
Produkt(String prodNavn, Avdeling avdeling) {
this.prodNavn = prodNavn;
this.avdeling = avdeling;
this.anmeldelser = new Anmeldelse[MAKS_ANTALL_ANMELDELSER];
this.antallAnmeldelser = 0;
}
/** @return Navn på produktet. */
public String hentProduktNavn() { return this.prodNavn; }
/** @return Avdelingen dette produktet tilhører. */
public Avdeling hentAvdeling() { return this.avdeling; }
/** @return Antall anmeldelser dette produktet har fått. */
public int hentAntallAnmeldelser() { return this.antallAnmeldelser; }
/**
* @param indeks Anmeldelsen angitt ved indeks skal returneres.
* @return anmeldelsen angitt ved indeks, null dersom indeks er ulovlig. */
public Anmeldelse hentAnmeldelse(int indeks) {
Anmeldelse anmeldelse = null;
if (0 <= indeks && indeks < antallAnmeldelser) {
anmeldelse = anmeldelser[indeks];
}
return anmeldelse;
}
/** Finner indeks til angitt anmeldelse i tabellen over anmeldelser.
* @param anmeldelse Metoden finner indeks til denne anmeldelsen.
* @return indeks til angitt anmeldelse dersom den finnes, -1 ellers. */
public int finnAnmeldelseIndeks(Anmeldelse anmeldelse) {
return HjelpeKlasse.finnNøkkel(anmeldelser, antallAnmeldelser, anmeldelse);
}
/** Innsetter angitt anmeldelse for dette produktet.
* @param anmeldelse Anmeldelsen som skal settes inn.
* @return true dersom anmeldelsen ble innsatt, false ellers. */
public boolean innsettAnmeldelse(Anmeldelse anmeldelse) {
boolean ok = antallAnmeldelser < MAKS_ANTALL_ANMELDELSER && anmeldelse != null;
if (ok)
anmeldelser[antallAnmeldelser++] = anmeldelse;
return ok;
}
/** @return Totalt antall nyttige stemmer som har blitt gitt til
* anmeldelsene for dette produktet. */
public int beregnTotaltAntallNyttigeStemmer() {
int antall = 0;
for (int i = 0; i < antallAnmeldelser; ++i) {
antall += anmeldelser[i].hentAntallNyttige();
}
return antall;
}
/**
* @return Totalt antall ikke-nyttige stemmer som har blitt gitt til
* anmeldelsene for dette produktet. */
public int beregnTotaltAntallIkkeNyttigeStemmer() {
int antall = 0;
for (int i = 0; i < antallAnmeldelser; ++i) {
antall += anmeldelser[i].hentAntallIkkeNyttige();
}
return antall;
}
/**
* @return Gjennomsnitt antall stjerner tildelt dette produktet,
* avrundes til nærmeste heltall. */
public int beregnGjennomsnittAntallStjerner() {
int sumStjerner = 0;
for (int i = 0; i < antallAnmeldelser; ++i) {
sumStjerner += anmeldelser[i].hentAntallStjerner();
}
double gjsnittStjerner = (double)sumStjerner / antallAnmeldelser;
return (int)Math.round(gjsnittStjerner);
}
/**
* Lager en hyppighetstabell over antall stjerner-hyppighet til anmeldelser,
* d.v.s. antall anmeldelser som fikk 0, 1, 2, o.s.v. stjerner.
* @return tabell med antall stjerner-hyppigheter */
public int[] lagAntallStjernerHyppighetsTab() {
int[] hyppighetsTabell = new int[Anmeldelse.MAKS_ANTALL_STJERNER + 1];
for (int i = 0; i < antallAnmeldelser; ++i) {
int antallStjerner = anmeldelser[i].hentAntallStjerner();
++hyppighetsTabell[antallStjerner];
}
return hyppighetsTabell;
}
/**
* Skriver histogram over antall stjerner-hyppighet til anmeldelser.
* d.v.s. antall anmeldelser som fikk 5, 4, 3 o.s.v. stjerner.
* Eksempel på histogram nedenfor viser at 1 anmeldelse til dette produktet
* fikk 5 stjerner, 2 anmeldelser til dette produktet fikk 4 stjerner, og
* 2 anmeldelser til dette produktet fikk 3 stjerner:
Stjerner: Antall anmeldelser
5: + (1)
4: ++ (2)
3: ++ (2)
2: (0)
1: (0)
0: (0)
*/
public void skrivHistogram() {
int[] hyppighetsTabell = lagAntallStjernerHyppighetsTab();
System.out.println("Stjerner: Antall anmeldelser");
for (int i = Anmeldelse.MAKS_ANTALL_STJERNER; i >= 0 ; --i) {
int hyppighet = hyppighetsTabell[i];
System.out.printf("%8d: %-5s (%d)%n", i,
HjelpeKlasse.fyllStreng(hyppighet, '+'), hyppighet);
}
}
/** Sammenligner to produkter for likhet.
* To produkter er like dersom de har samme navn og tilhører samme avdeling.
* @param obj det andre produktet som dette objektet skal sammenlignes med.
* @return true dersom de to produktene er like, false ellers. */
public boolean equals(Object obj) {
if (this == obj) { return true; }
if (!(obj instanceof Produkt)) { return false; }
Produkt produkt = (Produkt)obj;
return this.prodNavn.equals(produkt.prodNavn) &&
this.avdeling.equals(produkt.avdeling);
}
/** @return Strengrepresentasjon av dette produktet på følgende format:
* <produkt navn> har <antall anmeldelser> anmeldelser:
* <streng med gjennomsnitt antall '*'>
* (Totalt antall nyttige: <totalt antall nyttige>,
* Totalt antall ikke-nyttige: <totalt antall ikke-nyttige>).
* Eksempel: Java på 5 min. har 2 anmeldelser: **
* (Totalt antall nyttige: 6, Totalt antall ikke nyttige: 10) */
public String toString() {
return String.format("%s har %d anmeldelse(r): %-5s%n" +
" (Totalt antall nyttige: %d, Totalt antall ikke-nyttige: %d)",
this.prodNavn,
this.antallAnmeldelser,
HjelpeKlasse.fyllStreng(this.beregnGjennomsnittAntallStjerner(), '*'),
this.beregnTotaltAntallNyttigeStemmer(),
this.beregnTotaltAntallIkkeNyttigeStemmer());
}
}
int ikkeNyttig = 0;
for (int i = 0; i < antallAnmeldelser; ++i) {
antall += anmeldelser[i].hentAntallIkkeNyttige();
}
return ikkeNyttig;
}
int nyttig = 0;
for(int i = 0; i < antallAnmeldelser; ++i){
antall += anmeldelser[i].hentAntallNyttige();
}
return nyttig;
}
if (antallNyttige >= antallIkkeNyttige )
int mestNyttig = 0;
for(int i=0; i< produkt.hentAntallAnmeldelser(); i++){
int nyttige= produkt.hentAnmeldelse(i).hentAntallNyttige();
int ikkeNyttige= produkt.hentAnmeldelse(i).hentAntallIkkeNyttige();
if(nyttige >=ikkeNyttige){
if(nyttige>mestNyttig ){
mestNyttig = produkt.hentAnmeldelse(i).hentAntallNyttige();
}
}
}
return mestNyttig;
}
public boolean skrivAlleAnmeldelserTilFil(String filnavn) {
try {
FileWriter tekstFilSkriver = new FileWriter (filnavn);
PrintWriter tekstSkriver = new PrintWriter (tekstFilSkriver);
tekstSkriver.println(avdNavn);
tekstSkriver.println(finnTotaltAntallAnmeldelser1());
tekstSkriver.println(hentProdukt());
tekstSkriver.println(hentAntallStjerner());
tekstSkriver.println(hentAntallNyttige());
tekstSkriver.println(hentAntallIkkeNyttige());
tekstSkriver.println(hentAnmeldelseTekst());
for(int i = 0; i< antalIkkeNyttige; i++) {
tekstSkriver.println(anmeldelse[i].hentProdukt()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallStjerner()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallNyttige()+Anmeldelse.FELT_SLUTT_TEGN
+anmeldelse[i].hentAntallIkkeNyttige()+Anmeldelse.FELT_SLUTT_TEGN
tekstSkriver.close();
return true;
} catch (IOException unntak) {
System.out.println("Filhåndteringsfeil ved skriving til " + filnavn);
return false;
}
}
tekstSkriver.println(hentProdukt());
tekstSkriver.println(hentAntallStjerner());
tekstSkriver.println(hentAntallNyttige());
tekstSkriver.println(hentAntallIkkeNyttige());
tekstSkriver.println(hentAnmeldelseTekst());
for(int i = 0; i< antalIkkeNyttige; i++) {
tekstSkriver.println(hentAntallStjerner());
tekstSkriver.println(hentAntallNyttige());
tekstSkriver.println(hentAntallIkkeNyttige());
tekstSkriver.println(hentAnmeldelseTekst());
Registrerte brukere: Google [Bot]