Avatar billede madser22 Novice
11. januar 2012 - 20:18 Der er 33 kommentarer og
1 løsning

korteste spilletid fra et objekt

Som forlængelse af denne tråd:

http://www.eksperten.dk/spm/955030#reply_7891078

skal jeg nu i gang med opgave 7.

http://imageshack.us/photo/my-images/221/screenshot20120111at747.jpg/

Mine koder ser sådanne ud nu:

public class Track
{
    private String artist, songName;
    private int min, sec;

 
    public Track(String artist, String songName, int min, int sec)
    {
        this.artist = artist;
        this.songName = songName;
        this.min = min;
        this.sec = sec;
    }

 
    public String toString()
    {
        return(songName + ": " + artist + " (" + min + " :" + sec + " )");
    }
}


public class Driver
{

    public static void exam()
    {
        Track t1 = new Track("Yesterday", "The Beatles", 2,05);
        Track t2 = new Track("Paradise City", "Guns N Roses", 3,44);
        System.out.println(t1.toString());
        System.out.println(t2.toString());
     
        Playlist p = new Playlist
        p.add(t1);
        p.add(t2);
    }
}



public class Playlist
{
 
    public StringplaylistName()
    {
     
    }

 
    public void addTrack(Track t)
    {
        listofTrack.add(t);
    }
 
    public void removeTrack(Track t)
    {
        listofTrack.remove(t);
    }
 
    public Track findShortestTrack()
    {
 
    }

}
Avatar billede arne_v Ekspert
11. januar 2012 - 20:22 #1
Du har en liste med Track's og du loeber den liste igennem og finder den korteste.
Avatar billede arne_v Ekspert
11. januar 2012 - 20:23 #2
Til inspiration:

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 madser22 Novice
12. januar 2012 - 14:21 #3
Hej igen Arne. Mange tak for svaret.

Hvad er det præcist for-løkken betyder:
for(int i = 1; i < lst.size(); i++)

Er det den generelle form for en forløkke, som jeg altid skal starte med?

Jeg har oprettet en arraylist under "PLaylist" . Betyder det at jeg skal smide mine to objekter oprettet under min driver, ind i denne playlist, og derefter kalde den under "ShortestTrack" eller?

Jeg er lidt i tvivl om hvordan jeg får tilføjet dem til mit arraylist?

Mvh Mads
Avatar billede madser22 Novice
12. januar 2012 - 14:31 #4
Fra wikipedia:

"Princippet er at man starter med en tællevariabel i, sat til 1. Sidste led i "for-parentesen" angiver at man skal lægge én til tællevariablen, for hver gang operationerne i løkken er udført. Det midterste led fortæller at denne operation skal gentages så længe i er mindre end eller lig med 10"

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

Det giver svaret på mit første spørgsmål ihvertfald. Det vil sige hvis jeg havde 500 sange, skulle der stå:

for(int i=1; i<=500; i++)

tror jeg nok
Avatar billede arne_v Ekspert
12. januar 2012 - 14:38 #5
de 500 skal ikke hardcodes men du skal bruge faktisk stoerrelse fra din ArrayList (eller andet)
Avatar billede arne_v Ekspert
12. januar 2012 - 14:39 #6
Jeg vil finde det naturligvis hvis det er PlayList som har en metode til at finde shortest track.
Avatar billede madser22 Novice
12. januar 2012 - 14:45 #7
public Track findShortestTrack()
    for (int i=1; i <=10; i++)
    {
       
    }

Hvad gør jeg herefter?
Avatar billede madser22 Novice
12. januar 2012 - 14:50 #8
import java.util.*;


public class Playlist
{
    private Arraylist<Track> listofplaytime = new Arraylist<Track>

    public StringplaylistName()
    {
       
    }

   
    public void addTrack(Track t)
    {
        listofTrack.add(t);
    }
   
    public void removeTrack(Track t)
    {
        listofTrack.remove(t);
    }
   
    public Track findShortestTrack()
    for (int i=1; i <=10; i++)
    {
       
    }

}
Avatar billede madser22 Novice
12. januar 2012 - 17:27 #9
Jeg henviser lige til min tidligere tråd fra igår. Den er lukket, så derfor skrev jeg ikke lige videre på den:

http://www.eksperten.dk/spm/955030

Det jeg undrer mig over det er, at vi skal programmere dette ark på en halv time:

http://imageshack.us/f/4/screenshot20120112at518.jpg/

(i skal nok have det op i stort billede for at se det)

Koden som en fra mit hold har lavet ser sådan ud:

http://pastebin.com/51E3D5HB


Det jeg egentligt gerne vil have jer til at kigge på er under Journal Class.

Hans for løkker til de sidste 3 spørgsmål er meget korte ift mit sidste spørgsmål, hvor en for løkke til ét spørgsmål kom til at se sådan ud:

public Track findShortestTrack()
    {
        Track shortTrack = null;
        int min = 0;
        int sec = 0;
        // løber igennem alle Tracks og kigger først efter min. tal
        // derefter sek. og udskifter lowest track
        for(int i = 0;i<listOfTracks.size();i++){
                if(listOfTracks.get(i).getMin() > min){
                        min = listOfTracks.get(i).getMin();
                        sec = listOfTracks.get(i).getSec();
                     
                }
                else if (listOfTracks.get(i).getMin()== min) {
                        if(listOfTracks.get(i).getSec() > sec){
                                min = listOfTracks.get(i).getMin();
                                sec = listOfTracks.get(i).getSec();
                        }
                        }     
        }
        return shortTrack;
    }

Jeg tænker bare når jeg har en halv time til at lave hele arket, virker det lige pt som rigtig meget at skrive alt det.

Kan jeg ikke gøre det på en nemmere måde ligesom min studiekammerat har gjort?

Mvh Mads
Avatar billede madser22 Novice
12. januar 2012 - 18:21 #10
Hvis man skulle bruge compareTo, skulle man vel på en eller anden måde compare de to objekter der er oprettet i min driver class fra #0

Altså dvs (t1) og (t2)?

Mvh Mads
Avatar billede madser22 Novice
12. januar 2012 - 19:55 #11
Aaaarrnnnneeeeeeee hjælpe, hehe :-)
Avatar billede arne_v Ekspert
13. januar 2012 - 02:57 #12
Du skal ikke bruge 10 men bruge listofplaytime.size()
Avatar billede arne_v Ekspert
13. januar 2012 - 02:58 #13
Koden i #9 tror jeg ikke virker - shortTrack  vil altid vaere null.
Avatar billede arne_v Ekspert
13. januar 2012 - 02:59 #14
lav den ligesom min findMax2 metode
Avatar billede madser22 Novice
13. januar 2012 - 15:11 #15
Hej Arne.

Skal jeg skrive alt det fra #2 ??
Avatar billede madser22 Novice
13. januar 2012 - 15:15 #16
Kan jeg ikke bruge Compareto??

Jeg skrev i #9 at en fra mit hold havde lavet denne kode:

public class Journal
{
   
    private String name;
    private ArrayList<Article> listOfArticle = new ArrayList<Article>();

   
    public Journal(String name)
    {
        this.name = name; 
    }

    public void add(Article a)
    {
        listOfArticle.add(a);
    }
 
   
    public void remove(Article a)
    {
        listOfArticle.remove(a);
    }
 
   
    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;
    }
 
   
    public Article highScoreArticle()
    {
        Article result = listOfArticle.get(0);
        for (Article s : listOfArticle)
        {
            if (s.getScore() > result.getScore())
            {
                result = s;
            }
        }
        return result;
    }
 
   
    public void printArticles()
    {
        Collections.sort(listOfArticle);
        for (Article a : listOfArticle)
        {
            System.out.println(a); 
        }
    }
}

På dette har han løst opgave 7+8+9+10. Derfor virker det som ekstremt meget hvis jeg skal skrive følgende til at løse kun opgave 7:

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;
    }
}

Også vel og mærket at vi har en halv time til det. Det må da kunne gøres på en anden måde?

Mvh Mads
Avatar billede madser22 Novice
13. januar 2012 - 15:47 #17
Hej igen.

Hvad med noget ala det her:

http://imageshack.us/f/405/screenshot20120113at344.jpg/

Jeg får dog en fejl der?

Mvh Mads
Avatar billede madser22 Novice
13. januar 2012 - 16:23 #18
Avatar billede arne_v Ekspert
13. januar 2012 - 21:34 #19
Du skal jo kun bruge en af de 3 maader at loese opgaven paa.

Mit forslag var at bruge nummer 2.
Avatar billede arne_v Ekspert
13. januar 2012 - 21:37 #20
Med hensyn tild en kode saa brokker den sig vel over at du tester om equals uden at angive et argument.

Men selvom du gjorde kan jeg ikke se hvordan det skulle kunne finde det aeldste.
Avatar billede madser22 Novice
14. januar 2012 - 00:21 #21
Hvis jeg skulle bruge fx nr 2, er det så kun dette jeg skulle bruge:

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;

eller?
Avatar billede arne_v Ekspert
14. januar 2012 - 01:51 #22
Ja.

Det skal saa konverteres til dine klasser og metoder.
Avatar billede madser22 Novice
16. januar 2012 - 14:30 #23
Hejsa Arne.

Du må undskylde den lange ventetid, men jeg har så mange eksamener lige nu, så jeg har haft rigtigt rigtig travlt.

Ok jeg er ved at være med nu. Jeg skrev :

public Painting oldestPainting() {
   
    if(listOfPaintings.size() <= 0) return null;
   
        Painting res = listOfPaintings.get(0);
        for(int i = 1; i < listOfPaintings.size(); i++) {
            if(res.getValue() < listOfPaintings.get(i).getValue()) {
                res = listOfPaintings.get(i);
            }
        }
        return res;
   
}
   
}

og det kompilerer fint. Når jeg nu prøver at kalde "oldestPainting" får jeg bare "null" selvom jeg har add`et to malerier.

Ligger du ikke også et svar :-)

Mvh Mads
Avatar billede madser22 Novice
16. januar 2012 - 15:04 #24
Hej igen.

Jeg har lige taget nogle screenshots, for at vise hvad der ikke duer :-)

1: Tilføjet painting 1:
http://imageshack.us/photo/my-images/207/37003661.png/

2: Tilføjet painting 2:
http://imageshack.us/photo/my-images/803/29965294.png/

3: add painting 1 til Museum:
http://imageshack.us/photo/my-images/823/42411215.png/

4: add painting 1 til Museum:
http://imageshack.us/photo/my-images/39/88509469.png/

Det betyder at det var Mads Monet maleriet fra 1901 der skulle udskrives, men det er Arne Van Gogh der bliver udskrivet:

5: Udskriv:
http://imageshack.us/photo/my-images/252/screenshot20120116at258.png/

Hvordan kan jeg få ændret det?

Mvh Mads
Avatar billede madser22 Novice
16. januar 2012 - 15:10 #25
Her er koden af class Museum som kompilerer fint:

import java.util.*;
/**
* Mads Kristensen
* Studienr: 20117393
*/
public class Museum
{
    private String museumName;
    private ArrayList<Painting> listOfPaintings = new ArrayList<Painting>();

    public Museum (String museumName)
    {
        this.museumName = museumName;
    }

   
    public void add(Painting p) {
       
        listOfPaintings.add(p);
    }
   
    public void remove(Painting p) {
   
        listOfPaintings.remove(p);
    }
   
    public Painting oldestPainting() {
   
    if(listOfPaintings.size() <= 0) return null;
   
        Painting res = listOfPaintings.get(0);
        for(int i = 1; i < listOfPaintings.size(); i++) {
            if(res.getValue() < listOfPaintings.get(i).getValue()) {
                res = listOfPaintings.get(i);
            }
        }
        return res;
   
}
   
}
Avatar billede madser22 Novice
16. januar 2012 - 16:21 #26
Hvis jeg blot gør dette:

for(int i = 1; i < listOfPaintings.size(); i++)

istedet for dette:

for(int i = 1; i > listOfPaintings.size(); i++)

virker det. Er det bare det?


public Painting oldestPainting() {
 
    if(listOfPaintings.size() <= 0) return null;
 
        Painting res = listOfPaintings.get(0);
        for(int i = 1; i < listOfPaintings.size(); i++) {
            if(res.getValue() > listOfPaintings.get(i).getValue()) {
                res = listOfPaintings.get(i);
            }
        }
        return res;
 
}
 
}

Iøvrigt If sætningen behøves jeg vel ikke, når jeg ikke addèr objekter til mit arraylist fra denne klasse?
Avatar billede arne_v Ekspert
16. januar 2012 - 19:28 #27
for(int i = 1; i > listOfPaintings.size(); i++)

laver ingen gennemloeb hvis der er mere end et element, saa det skal absolut vaere:

for(int i = 1; i < listOfPaintings.size(); i++)
Avatar billede arne_v Ekspert
16. januar 2012 - 19:29 #28
Det er:

if(res.getValue() > listOfPaintings.get(i).getValue()) {

som goer at res ender med at pege paa det som har den stoerste value.
Avatar billede madser22 Novice
16. januar 2012 - 23:31 #29
Hejsa Igen Arne.

Jamen, så tror jeg, jeg er med på det. Mange tak for hjælpen, og ligger du ikke et svar?

Hvis man skal benytte metoden oldestPainting (Museum) og toString (Painting) til i exam-metoden i Driver-klassen at udskrive det ældste Painting-objekt af de to der er oprettet og knyttet til museet.

Ville det så svare noget til:

System.out.println(oldestPainting().toString());

eller

System.out.println(oldestPainting().size());

eller noget helt tredje?
Avatar billede arne_v Ekspert
16. januar 2012 - 23:44 #30
System.out.println(mymuseum.oldestPainting().toString());

vil jeg tro.
Avatar billede arne_v Ekspert
16. januar 2012 - 23:44 #31
og et svar
Avatar billede madser22 Novice
16. januar 2012 - 23:51 #32
Det compilerer ikke med:

System.out.println(mymuseum.oldestPainting().toString());

men det compilerer med:

System.out.println(m.oldestPainting().toString());

Jeg kan dog ikke se noget når jeg udskriver fra Driver klassen. Der kommer kun de to objekter jeg tidligere har tilføjet:

/**
* Mads Kristensen
* Studienr: 20117393
*/
public class Driver
{   
    public static void exam() {
       
        Painting p1 = new Painting("Vencent Van Gogh", "Starry Night", 1889, 3452);
        Painting p2 = new Painting("Lars Thomsen", "Flower", 1839, 3746);
        System.out.println(p1.toString());
        System.out.println(p2.toString());
       
        Museum m = new Museum("Test");
        m.add(p1);
        m.add(p2);
       
        System.out.println(m.oldestPainting().toString());
    }

   
}


Nu vel, det er nok heller ikke den vigtigste opgave, så jeg går fluks videre med den næste :-)

Tusind tak for hjælpen:-)
Mvh Mads
Avatar billede arne_v Ekspert
16. januar 2012 - 23:57 #33
Faar oldestPainting fundet den aeldste?
Avatar billede madser22 Novice
17. januar 2012 - 00:14 #34
Hejsa Arne. Ja den finder den ældste.
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