Avatar billede madseksperten Nybegynder
06. december 2011 - 00:32 Der er 30 kommentarer og
1 løsning

returnere højeste værdi

Hejsa igen eksperten og Arne :-)

Jeg er jo igang med et opgavesæt, hvor der i alt er 10 opgaver. Det er nogenlunde det samme som kan komme til eksamen, så jeg vil gerne forstå dem korrekt, derfor stiller jeg nok også nogle dumme spørgsmål. Som set i tråden tidligere fra idag, er jeg nu kommet til spørgsmål 7, som lyder:

http://imageshack.us/photo/my-images/7/nytbillede3.png/

("Programmér metoden mostEntertaining. Metoden skal returnere kampen med flest scorede mål (det
kan antages at der er spillet mindst en kamp i turneringen, og hvis flere kampe er lige målrige, er det
underordnet hvilken der returneres). Udvid Game-klassen med de nødvendige get-metoder")

Hvordan griber jeg dette an? Det værste er at jeg er virkelig på bar bund, hvordan jeg starter ud?

Håber i har tid til at hjælpe mig igen?

Mvh Mads
Avatar billede agertoft Nybegynder
06. december 2011 - 01:17 #1
I din Driver-klasse har du 3 Game-objekter, g1, g2 og g3. Du skal returnere det Game-objekt hvor (homeScore + awayScore) er størst.

Først lavet du en get-metode i Game-klassen:

public int getTotalScore()
{
    int totalScore = homeScore + awayScore;
    return totalScore;
}

I og med at opgiven siger du KUN har tre objekter, kan du gøre det ved at lave denne metode i Game-klassen:

public string mostEntertaining()
{
    Game tmpGame;
    if (g1.getTotalScore() > g2.getTotalScore())
        tmpGame = g1;
    else
        tmpGame = g2;

    if (tmpGame.getTotalScore() > g3.getTotalScore())
        return tmpGame.toString();
    else
        return g3.toString();
}

Hvis der var tale om flere objekter end de 3 Game-objekter, kunne du have smidt dem i en ArrayList og itereret gennem den. Men nu hvor der kun er tre, kan du bruge denne løsning.
Avatar billede arne_v Ekspert
06. december 2011 - 01:53 #2
mostEntertaining metoden er i Tournament klassen, saa der er en ArrayList!
Avatar billede arne_v Ekspert
06. december 2011 - 01:56 #3
Enten kan du bruge samme teknik som i #1 og iterere over den ArrayList.

Eller du kan bruge Collections max metoden med en Comparator.
Avatar billede arne_v Ekspert
06. december 2011 - 01:56 #4
Det foerste er det mest simple!
Avatar billede agertoft Nybegynder
06. december 2011 - 02:11 #5
Nårh ja. Men ja, idéen er den samme. Du itererer bare med en for-løkke gennem Game objekterne på samme måde som i #1.
Avatar billede madseksperten Nybegynder
06. december 2011 - 15:34 #6
hejsa.

Mange tak for input. Jeg er lidt i tvivl om hvor for løkken skal være.

public int getTotalScore()
{
    int totalScore = homeScore + awayScore;
    return totalScore;
}

public string mostEntertaining()
{
    Game tmpGame;
    if (g1.getTotalScore() > g2.getTotalScore())
        tmpGame = g1;
    else
        tmpGame = g2;

    if (tmpGame.getTotalScore() > g3.getTotalScore())
        return tmpGame.toString();
    else
        return g3.toString();
}

Er der noget af teksten der skal væk, eller skal der blot tilføjes en forløkke eller?

mvh
Avatar billede arne_v Ekspert
06. december 2011 - 15:53 #7
if'erne skal erstattes af en if inden i en for
Avatar billede madseksperten Nybegynder
06. december 2011 - 16:43 #8
Nu stiller jeg absolut ikke spørgsmål til jeres viden, men synes bare det er så mærkeligt. Vi skal programmere 10 spørgsmål på en ½ time. Jeg har en del andre eksamensopgaver, og jeg har også set andres, hvor deres kode overhovedet ikke er så lang i spørgsmål 7.

Kan man ikke skrive koden på en meget kortere måde?

mvh
Avatar billede madseksperten Nybegynder
06. december 2011 - 16:51 #9
men det er selvføgelig også lidt andre spørgsmål. Her er et andet et , som vi afleverede som også er under spørg 7:

"Programmér metoden selectByAuthor. Metoden skal returnere alle artikler skrevet af en bestemt forfatter. Udvid Article-klassen med de nødvendige get-metoder"

hvor vi skrev:

public List<Article> selectByAuthor(String s)
    {
        List<Article> result = new ArrayList<Article>();
        for (Article a : listOfArticle)
        {
            if (a.getAuthor().equals(s))
            {
                result.add(a);
            }
        }
        return result;
    }

Men det er vel ikke noget jeg kan bruge i det andet spørgsmål ?
Avatar billede arne_v Ekspert
06. december 2011 - 16:51 #10
en for loekke med en if indeni boer kun tage 1-2 minutter at skrive
Avatar billede arne_v Ekspert
06. december 2011 - 16:53 #11
Loesningen er ret meget lignende med den kode?
Avatar billede arne_v Ekspert
06. december 2011 - 16:56 #12
public string mostEntertaining()
{
    Game tmpGame = null;
    for(...) {
      if(...) {
          ...
      }
    }
    return tmpGame;
}
Avatar billede madseksperten Nybegynder
06. december 2011 - 17:23 #13
public Game mostEntertaining() {
        Game tmpGame = null;
       
        for() {
       
        }
            if() {
           
        }
    }

Starten på en for-løkke skal vel hedde noget med:

for(int i=0;1<10;i++)

ikke?
Avatar billede arne_v Ekspert
06. december 2011 - 17:38 #14
Nej - if inden i for.
Avatar billede arne_v Ekspert
06. december 2011 - 17:39 #15
for(int i = 0; i < dinlist.size(); i++) {

eller

for(Game g : dinlist) {
Avatar billede madseksperten Nybegynder
06. december 2011 - 17:39 #16
Sorry, ja min fejl. Er det rigtig startet?

public string mostEntertaining()
{
    Game tmpGame = null;
    for(int i=0;1<10;i++) {
      if(...) {
          ...
      }
    }
    return tmpGame;
}
Avatar billede madseksperten Nybegynder
06. december 2011 - 17:40 #17
hov, så ikke lige dit svar. Jeg kigger lige på den først
Avatar billede arne_v Ekspert
06. december 2011 - 17:43 #18
og du skal jo have erstattet alle ... med det rigtige
Avatar billede madseksperten Nybegynder
06. december 2011 - 17:51 #19
Jeg synes sku det er svært. Der er vel ikke en der kan vise mig hvordan jeg skal skrive det. Det er på ingen måde for at skrive af, men simpelthen se formen på det. jeg har skrevet

public Game mostEntertaining() {
{
    Game tmpGame = null;
    for(Game g : Game) {
      if (g1.getTotalScore() > g2.getTotalScore())
        tmpGame = g1;
    else
        tmpGame = g2;

      if (tmpGame.getTotalScore() > g3.getTotalScore())
        return tmpGame.toString();
    else
        return g3.toString(); 
      }
    }
    return tmpGame;
}

men ved godt det er totalt forkert. Mit arraylist hedder iøvrigt Game, derfor har jeg sat Game øverst ved den udvidede forløkke
Avatar billede arne_v Ekspert
06. december 2011 - 18:03 #20
du har kun brug for en enkelt if inden i for loekksen
Avatar billede arne_v Ekspert
06. december 2011 - 18:17 #21
Logikken er simpel:
- du loeber alle games igennem
- hvis game er mere underholdende end det hidtil mest underholdende game saa opdaterer du game til at vaere det hidtil mest underholdende game
Avatar billede madseksperten Nybegynder
06. december 2011 - 20:04 #22
import java.util.*;

public class Tournament
{
    private ArrayList<Game> listOfGame= new ArrayList<Game>();
   
    public Tournament(String name)
    {
       
    }

    public void add(Game g) {
   
        listOfGame.add(g);
    }
   
    public void remove(Game g) {
   
        listOfGame.remove(g);
    }
   
    public Game mostEntertaining() {
{
    Game tmpGame = null;
    for(Game g : Game) {
      if (g1.getTotalScore() > g2.getTotalScore())
        tmpGame = g1;
    else
        tmpGame = g2;

      if (tmpGame.getTotalScore() > g3.getTotalScore())
        return tmpGame.toString();
    else
        return g3.toString(); 
      }
    }
    return tmpGame;
}
   
   
    /*public int totalScores() {
       
   
    }
   
    public void printGames() {
   
    }
    */
}

jeg er ked af det, men kan stadigvæk ikke se hvorfor man ikke kan bruge 2 if sætninger. Det giver meget mening for mig at gøre det.
Avatar billede arne_v Ekspert
06. december 2011 - 20:18 #23
Du har jo ikke nogle g1, g2 og g3!

Du har listOfGames med et vilkaarligt antal Game's i.

Med g1, g2 og g3 har du brug for 2 if'er.

Med en liste har du brug for list.size()-1 if'er. Det laves nemmest med en for og en if.
Avatar billede arne_v Ekspert
06. december 2011 - 20:20 #24
Proev og forestil dig at du skal finde det stoerste af en vilkaarlig liste af tal.

4
7
2
3
8
5

Hvordan vil du goere det?

En mulighed er:
- set max=foerste tal=4
- sammenlign max med 7 og da 7 er stoerre saet max=7
- sammenlign max med 2 og goer ingenting
- sammenlign max med 3 og goer ingenting
- sammenlign max med 8 og da 8 er stoerre saet max=8
- sammenlign max med 5 og goer ingenting
Avatar billede arne_v Ekspert
06. december 2011 - 20:25 #25
I Java:

import java.util.ArrayList;

public class Max {
    public static void main(String[] args) {
        ArrayList<Integer> lst = new ArrayList<Integer>();
        lst.add(4);
        lst.add(7);
        lst.add(2);
        lst.add(3);
        lst.add(8);
        lst.add(5);
        int max = lst.get(0);
        for(int i = 1; i < lst.size()-1; i++) {
            if(max < lst.get(i)) {
                max = lst.get(i);
            }
        }
        System.out.println(max);
    }
}
Avatar billede arne_v Ekspert
06. december 2011 - 20:26 #26
VIGTIGT: du skal ogsaa lige haandtere situationen hvor listen ingen elementer har!
Avatar billede madseksperten Nybegynder
06. december 2011 - 23:36 #27
Hejsa Arne.

Jeg er ved at være lidt mere med nu. Som der står i opgaven:

Programmér metoden mostEntertaining. Metoden skal returnere kampen med flest scorede mål (det kan antages at der er spillet mindst en kamp i turneringen, og hvis flere kampe er lige målrige, er det
underordnet hvilken der returneres). Udvid Game-klassen med de nødvendige get-metoder.

I min driver klasser har jeg nu koden:


/**
* Write a description of class Driver here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Driver
{
    public static void exam() {
   
        Game g1 = new Game("FCK", "Esbjerg", 8, 6);
        Game g2 = new Game("AGF", "Brøndby", 2, 0);
        Game g3 = new Game("Silkeborg", "Viborg", 3, 9);
        System.out.println(g1.toString());
        System.out.println(g2.toString());
        System.out.println(g3.toString());
       
        Tournament t = new Tournament("t");
        t.add(g1);
        t.add(g2);
        t.add(g3);
    }
}

I min Game:


/**
* Write a description of class Game here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Game
{
    private String home, away;
    private int homeScore, awayScore;
    public Game(String home, String away, int homeScore, int awayScore)
    {
        this.home = home;
        this.away = away;
        this.homeScore = homeScore;
        this.awayScore = awayScore;
    }

   
    public String toString()
    {
        return ( home + " - " + away + ", " + (homeScore + " - " + awayScore));
    }
}

og i min Tournament:

import java.util.ArrayList;

public class Tournament
{
    private ArrayList<Game> listOfGame= new ArrayList<Game>();
   
    public Tournament(String name)
    {
       
    }

    public void add(Game g) {
   
        listOfGame.add(g);
    }
   
    public void remove(Game g) {
   
        listOfGame.remove(g);
    }
   
    public Game mostEntertaining() {
      ArrayList<Integer> lst = new ArrayList<Integer>();
      lst.add();
      lst.add();
      lst.add();
      int max = lst.get(0);
      for(int i = 1; i<lst.size()-1; i++) {
        if(max < lst.get(i)) {
            max = lst.get(i);
        }
      }
      System.out.println(max);
    }
   
   
    /*public int totalScores() {
       
   
    }
   
    public void printGames() {
   
    }
    */
}

Som du skrev i #25:
ArrayList<Integer> lst = new ArrayList<Integer>();
        lst.add(4);
        lst.add(7);
        lst.add(2);

i lst.add(); vil jeg jo gerne have g1, g2 og g3 ind, da de i min driver klasse er defineret. Det er de kampe mål de skal returnere. Du skriver jo godt nok i #23at der ikke skal g1, g2 og g3 ind, men det er i opgaven beskrevet at det er disse kampe jeg skal hente, sådan som jeg forstår det i hvertfald.

Det er forkert hvis jeg gerne vil skrive noget med:

ArrayList<Integer> lst = new ArrayList<Integer>();
        lst.add(g1);
        lst.add(g2);
        lst.add(g3);

Det er forkert, men tænker jeg forkert?
Avatar billede agertoft Nybegynder
07. december 2011 - 00:25 #28
Du har jo allerede en ArrayList i din Tournament-klasse. Hvorfor opretter du en ny i din mostEntertaining-metode?

Det er listOfGame du skal iterere igennem og sætte max = getTotalScore() som blev lavet i #1.
Avatar billede agertoft Nybegynder
07. december 2011 - 00:31 #29
public Game mostEntertaining() {
       
      int gameIndex = 0;
      int max = listOfGame.get(0).getTotalScore();
      for(int i = 1; i<listOfGame.size()-1; i++) {
        if(max < listOfGame.get(i).getTotalScore())) {
            max = listOfGame.get(i).getTotalScore();
            gameIndex = i;
        }
      }
      System.out.println(listOfGame.get(i).toString());
    }
Avatar billede agertoft Nybegynder
07. december 2011 - 00:32 #30
System.out.println(listOfGame.get(gameIndex).toString());

skulle det selvfølgelig være.
Avatar billede arne_v Ekspert
16. december 2011 - 02:17 #31
Lidt inspirerende eksempler:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class FindMaxDemo {
    private List<Data> lst = new ArrayList<Data>();
    public void addTestData() {
        lst.add(new Data(3));
        lst.add(new Data(7));
        lst.add(new Data(1));
        lst.add(new Data(6));
        lst.add(new Data(2));
    }
    public Data findMax1() {
        if(lst.size() <= 0) return null;
        int maxix = 0;
        int maxval = lst.get(maxix).getValue();
        for(int i = 1; i < lst.size(); i++) {
            if(maxval < lst.get(i).getValue()) {
                maxix = i;
                maxval = lst.get(maxix).getValue();
            }
        }
        return lst.get(maxix);
    }
    public Data findMax2() {
        if(lst.size() <= 0) return null;
        Data res = lst.get(0);
        for(int i = 1; i < lst.size(); i++) {
            if(res.getValue() < lst.get(i).getValue()) {
                res = lst.get(i);
            }
        }
        return res;
    }
    public Data findMax3() {
        return Collections.max(lst, new Comparator<Data>() {
            public int compare(Data d1, Data d2) {
                return d1.getValue() - d2.getValue();
            }
        });
    }
    public static void main(String[] args) {
        FindMaxDemo demo = new FindMaxDemo();
        demo.addTestData();
        System.out.println(demo.findMax1().getValue());
        System.out.println(demo.findMax2().getValue());
        System.out.println(demo.findMax3().getValue());
    }
}

class Data {
    private int value;
    public Data(int value) {
        this.value = value;
    }
    public int getValue() {
        return value;
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester