spelly Skrevet 2. mai 2011 Del Skrevet 2. mai 2011 (endret) Etter å ha prøvd, men failet med å skrive metoden, siden klokken 17!!! i går, har jeg intet annet valg enn å ty til hjelp fra dere. Programmet er bygget opp av 5 klasser, problemet ligger i klassen: Avdeling. Det er hovedsaklig en metode jeg virkelig trenger hjelp til, det er metoden: public int finnMestNyttigVerdi(Produkt produkt) Metoden ligger på linje 95. Det metoden skal gjøre er å finne de mest nyttige anmeldelsene til et produkt. En anmeldelse er mest nyttig for et produkt dersom den har største antall nyttige stemmer som er støre eller lik de tilsvarende ikke-nyttige stemmene. For eksempel: 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 dette tilfellet er anmeldelse 2 og 3 mest nyttig. Her er mitt forsøk på å gjøre det nevnte, uten hell: int totaltAntall = 0; for ( int i = 0; i < antallProdukter; ++i){ totaltAntall += produkter [i].hentAntallAnmeldelser(); if (antallProdukter[i]>=5) totaltAntall++; } int nyttige = totaltAntall[0]; for (int i = 0; i < totaltAntall.length; i++) { if (nyttige > totaltAntall[i]) nyttige = totaltAntall [i]; } int ikkeNyttige = 0; for (int i = 0; i < totaltAntall.length; indeks ++) { if (ikkeNyttige < totaltAntall [i]) ikkeNyttige = totaltAntall [i]; } som takk for hjelpen gir jeg 50.- til den som kan hjelpe meg å få denne metoden til å fungere slik som nevnt. Her er koden til klassen Avdeling: 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 Anmeldelse: /** 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); } } Klassen hjelpeklasse: /** 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 nettbutikk /** 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); } } og til slutt klassen produkt /** 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()); } } Håper noen kan hjelpe meg å skrive den nevnte klassen. Endret 2. mai 2011 av spelly Lenke til kommentar
torbjørn marø Skrevet 2. mai 2011 Del Skrevet 2. mai 2011 Dette er det tredje forumet jeg ser oppgaven din på i kveld Hvis du hadde forsøkt å koke ned oppgaven til noe som var lettere å konsumere (20 i stedet for 200 linjer kode), og vist at du hadde forsøkt litt selv, så kanskje du hadde fått litt mer hjelp. Forsøk å forklare hvordan du tenker når du skal skrive metoden, og hvorfor det ikke går som du forventer.., hva som går galt. Det er ingen som bare vil gi deg løsningen, men mange som vil gi deg tips og hint som du kan lære av. Lenke til kommentar
mroystein Skrevet 2. mai 2011 Del Skrevet 2. mai 2011 (endret) Hei. Det var ikke lett å skjønne hva de mener i oppgave teksten, men jeg prøver meg. Det den metoden skal returnere er vel tallet 8 i det eksemplet? Altså bare velge den anmeldelsen som er har størst nytte og har større nytteverdi enn ikke-nytteverdi? Noe sånn? public int finnMestNyttigVerdi(Produkt produkt) { int beste = 0; for(int i=0; i< produkt.antallAnmeldelser; i++){ int nyttige= produkt. hentAnmeldelse(i).antallNyttige; int ikkeNyttige= produkt. hentAnmeldelse(i).antallIkkeNyttige; if(nyttige >=ikkeNyttige){ if(nyttige>beste ){ beste =nyttige; } } } return beste; } Endret 2. mai 2011 av mroystein Lenke til kommentar
GeirGrusom Skrevet 3. mai 2011 Del Skrevet 3. mai 2011 I en slik oppgave kan en banne over at java mangler lambdauttrykk :/ Lenke til kommentar
spelly Skrevet 3. mai 2011 Forfatter Del Skrevet 3. mai 2011 (endret) Takker for tilbakemeldinger! Jeg har litt problem med enda en metode, denne skal skrive antall anmeldelser til en fil. Metoden ligger i klassen: Anmeldelse. Slik ser metoden ut: /** * 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(hentAntallStjerner()); tekstSkriver.println(hentAntallNyttige()); tekstSkriver.println(hentAntallIkkeNyttige()); 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; } } Feilmeldingen jeg får er: Cannot be resolved to a variable. Denne feilmeldingen får jeg fra linje: 151 - 160. Endret 3. mai 2011 av spelly Lenke til kommentar
miXer Skrevet 3. mai 2011 Del Skrevet 3. mai 2011 I skrivAlleAnmeldelserTilFil metoden din har du ikke avsluttet println inni for'en din. Lenke til kommentar
spelly Skrevet 3. mai 2011 Forfatter Del Skrevet 3. mai 2011 Se der ja! Takker. Der forsvant en del feilmeldinger. No får jeg bare feilmelding på følgende: tekstSkriver.println(produkt); tekstSkriver.println(hentAntallStjerner()); tekstSkriver.println(hentAntallNyttige()); tekstSkriver.println(hentAntallIkkeNyttige()); for(int i = 0; i<antalIkkeNyttige; i++) { Hva er gale? Lenke til kommentar
miXer Skrevet 3. mai 2011 Del Skrevet 3. mai 2011 Hva slags feilmelding er det du får da? Prøv å vær litt mer utdypende i spørsmålene dine. Bare de 5 linjene der gir oss ingen aning om hva feilen kan være. Er produkt en variabel som er tilgjengelig? Er hentAntallStjerner() tilgjengelig? Gi litt mer oversiktlige spørsmål! Lenke til kommentar
spelly Skrevet 3. mai 2011 Forfatter Del Skrevet 3. mai 2011 Beklager. Prøver igjen. Jeg har metoden: public boolean skrivAlleAnmeldelserTilFil(String filnavn) { Denne skal gjøre følgende: Den skal skrive alle anmeldelser for alle produkter i 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å skal det skrives ut en post per linje som inneholder opplysninger om en anmeldelse. Koden jeg har laget for dette er: 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; } } her gir tekstSkriver.println(hentProdukt()); tekstSkriver.println(hentAntallStjerner()); tekstSkriver.println(hentAntallNyttige()); tekstSkriver.println(hentAntallIkkeNyttige()); tekstSkriver.println(hentAnmeldelseTekst()); for(int i = 0; i< antalIkkeNyttige; i++) { feilmelding. alle tekstskriver.println() gir følgende feilmelding: the method hentProdukt() is undefined for the type Avdeling og for løkken gir feilmeldingen: -Syntax error on token(s), misplaced construct(s) -antallIkkeNyttige cannot be resolved to a variable Hvordan kan jeg fikse dette? Lenke til kommentar
miXer Skrevet 3. mai 2011 Del Skrevet 3. mai 2011 Det står jo ganske enkelt forklart i feilmeldingen hva som er problemet: - hentProdukt er ikke angitt i klassen Avdeling. Denne er vel enten angitt i en annen klasse eller du må opprette denne metoden i Avdelingsklassen - i for'en din så har du fortsatt ikke avsluttet println metoden - antallIkkeNyttige er ikke angitt, ikke instansiert eller finnes i en klasse Virker som du ikke helt har fått med deg grunnforståelsen i java. Lenke til kommentar
spelly Skrevet 5. mai 2011 Forfatter Del Skrevet 5. mai 2011 (endret) TAkker for tilbakemelding. antallIkkeNyttige finnes i klassen anmeldelse. Den kan hentes med: hentAntallNyttige(). Hvordan kan jeg hente antallIkkeNyttige? anmeldelse.antallIkkeNyttige() . funker ikke... oooog.... public void skrivMestNyttigeAnmeldelser(Produkt produkt) { int anmeldelse = finnMestNyttigVerdi(produkt); System.out.println (produkt.hentAnmeldelse(anmeldelse).toString); } Denne skal skrive ut mest nyttige anmeldelse, jeg får error på .toString.feilmeldingen er: tostring is not resolved or is not a field. Hva er gale? Endret 5. mai 2011 av spelly Lenke til kommentar
GeirGrusom Skrevet 6. mai 2011 Del Skrevet 6. mai 2011 .toString er en funksjon, og må da følgelig ha funksjonsoperatøren (). Lenke til kommentar
Sokkalf™ Skrevet 6. mai 2011 Del Skrevet 6. mai 2011 Det er viktig å lese og forstå feilmeldingene som kompilatoren gir deg. Det er også stor hjelp i å bruke en editor/IDE som Eclipse/NetBeans e.l, som fanger opp mange av disse feilene for deg og forteller hva som er galt. Lenke til kommentar
spelly Skrevet 6. mai 2011 Forfatter Del Skrevet 6. mai 2011 Takker for gode tilbakemeldinger! I begynnelsen var det ekstremt vanskelig å tyde feilmeldinger, no går det etter hver bedre. Regner med at til slutt vil det være "barnemat" å forstå samt fikse dem. Må bare få gode programmerings vaner. Hvordan kan jeg fikse feilmeldingene jeg får på disse? Regner med at jeg har glemt å skrive noe, jeg finner bare ikke ut hva... tekstSkriver.println(finnTotaltAntallAnmeldelser1()); tekstSkriver.println(hentProdukt()); tekstSkriver.println(hentAntallStjerner()); tekstSkriver.println(hentAntallNyttige()); tekstSkriver.println(hentAntallIkkeNyttige()); tekstSkriver.println(hentAnmeldelseTekst()); ? Alle verdiene (hentProdukt, hentAntallStjerner osv, skal hentes fra klassen anmeldelse. Takker på forhånd for tilbakemeldinger! Lenke til kommentar
blackbrrd Skrevet 6. mai 2011 Del Skrevet 6. mai 2011 (endret) Takker for gode tilbakemeldinger! I begynnelsen var det ekstremt vanskelig å tyde feilmeldinger, no går det etter hver bedre. Regner med at til slutt vil det være "barnemat" å forstå samt fikse dem. Må bare få gode programmerings vaner. Hvordan kan jeg fikse feilmeldingene jeg får på disse? Regner med at jeg har glemt å skrive noe, jeg finner bare ikke ut hva... tekstSkriver.println(finnTotaltAntallAnmeldelser1()); tekstSkriver.println(hentProdukt()); tekstSkriver.println(hentAntallStjerner()); tekstSkriver.println(hentAntallNyttige()); tekstSkriver.println(hentAntallIkkeNyttige()); tekstSkriver.println(hentAnmeldelseTekst()); ? Alle verdiene (hentProdukt, hentAntallStjerner osv, skal hentes fra klassen anmeldelse. Takker på forhånd for tilbakemeldinger! Hvis f.eks hentProdukt() er en metode i klassen Anmeldelse så må du kalle den fra et Anmeldelse-objekt. Noe slikt som dette. Anmeldelse anmeldelse = new Anmeldelse(); .... tekstSkriver.println(anmeldelse.hentProdukt()); Det virker forresten som du sliter med et basis-konsept, og det er at en feilmelding vil alltid peke til EN linje i koden din. For å få hjelp bør du minimum: a) poste linjen det er feil på b) poste feilmeldingen Kan du poste linjen det er feil på og feilmeldingen? Kan du som en øvelse for deg selv også oversette feilmeldingen til Norsk og forklare hva du tror den betyr? Endret 6. mai 2011 av blackbrrd Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå