Problem med: public int finnMestNyttigVerdi

Problem med: public int finnMestNyttigVerdi

Innleggav sausenebb » man 02.05.2011 5:13

Etter å ha arbeidet iherdig, uten å finne noen løsning på dette, har jeg intet annet valg enn å ty til hjelp fra dere. (håper virkelig dere kan hjelpe!)

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:
Kode: Merk alt
 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:
Kode: Merk alt
 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 koden til klassen Avdeling:

Kode: Merk alt
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:
Kode: Merk alt
/** 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:
Kode: Merk alt
/** 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
Kode: Merk alt
/** 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
Kode: Merk alt
/** 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.







Her er forøvrig siste resultat av kode - (svada...) jeg laget til den nevnte metoden, før jeg måtte ty til hjelp her:
Kode: Merk alt
       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 )
medlem i 137 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav sausenebb » tir 03.05.2011 13:09

Jeg klarte å finne mest nyttige verdi med å gjøre følgende:
Kode: Merk alt
       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;
  }



Da er spørsmålet: hvordan kan jeg skrive ut de mest nyttige anmeldelsene?
Jeg har metoden public void skrivMestNyttigeAnmeldelser(Produkt produkt) {
}

Hvor dette skal gjøres.

Det fungere ikke med: System.out.println(mestNyttig); ...
medlem i 137 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav dundee » tir 03.05.2011 13:35

Hvis du, i følge eksempelet, ønsker å skrive ut anmeldelse 2 og 3 kan du gjøre det på følgende måte:

Returner en liste eller et array av ints fra "finnMestNyttigVerdi" i stedet for en int. Slik du har satt den opp nå vil kun 2 bli returnert, selv om anmeldelse 3 kanskje er enda bedre.

For å skrive ut
System.out.println (produkt.hentAnmeldelse(i).toString);

Hvis du bare skal ha en anmeldelse blir skrivUt-metoden din omtrent slik
int anmeldelse = finnMestNyttigVerdi(Produkt);
System.out.println (produkt.hentAnmeldelse(anmeldelse).toString);

Har du i stedet en liste kan du gjøre slik
List anmeldelse = finnMestNyttigVerdi(Produkt);
for (int i : anmeldelse) {
System.out.println (produkt.hentAnmeldelse(i).toString);
}


Når du prøver System.out.println(MestNyttig) er problemet at MestNyttig bare er en int, ikke en Anmeldelse.
medlem i 157 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav sausenebb » ons 04.05.2011 0:50

Takker og bukker for tilbakemeldingen!

Jeg har et forhåpentligvis siste spørsmål:

Jeg har følgende metode:
Kode: Merk alt
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;
        }
      }



Følgende får jeg feilmelding på :
Kode: Merk alt
tekstSkriver.println(hentProdukt());
        tekstSkriver.println(hentAntallStjerner());
        tekstSkriver.println(hentAntallNyttige());
        tekstSkriver.println(hentAntallIkkeNyttige());
        tekstSkriver.println(hentAnmeldelseTekst());
       
      
       
        for(int i = 0; i< antalIkkeNyttige; i++) {
hva er årsaken til dette og hvordan kan det fikses?
medlem i 137 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav sausenebb » fre 06.05.2011 15:46

bump
medlem i 137 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav dundee » fre 06.05.2011 15:56

Hvilken feilmelding får du?
medlem i 157 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav sausenebb » fre 06.05.2011 16:36

felmeldingne jeg får er:

- cannot be resolved to a variable
- the method hentAntallNyttige() is undefined for the type avdeling

Følgende skal hentes fra klassen Anmeldelse:
Kode: Merk alt
tekstSkriver.println(hentAntallStjerner());
        tekstSkriver.println(hentAntallNyttige());
        tekstSkriver.println(hentAntallIkkeNyttige());
        tekstSkriver.println(hentAnmeldelseTekst());
medlem i 137 måneder
 

Re: Problem med: public int finnMestNyttigVerdi

Innleggav dundee » man 09.05.2011 10:53

Har desverre ikke hatt tid til å se på dette i helga, men et par kjappe tips:
- Bruk google, den type feilmeldinger du har fått har vanligvis en grei løsning.
- Sjekk referansene dine. Det kan se litt ut som om du kaller metoder fra en annen klasse enn der metoden ligger. Dette bør gjøres via objekter eller klassenavn (eksplisitt referanse) for å gjøre ting mer oversiktlig.

Metoden du viser ser riktig ut i seg selv, det er kontekst i klassen som er problemet.
medlem i 157 måneder
 


Returner til Java



Hvem er i Forumene

Registrerte brukere: Google [Bot]