Trädvy Permalänk
Medlem
Registrerad
Feb 2017

Uppgift i skolan JAVA

Hej,

Det är så att jag fått en uppgift i skolan där jag ska färdigställa följande programsnutt:

public class BearCollection {

public void add(Bear b) {
for (Bear inCollection : bears) {
if (b.getName().equals(inCollection.getName())) {
return;
}
}
bears.add(b);
}
}

Enligt denna beskrivning:

"Add-metoden som ingår i klassen BearCollection ska kompletteras så att poängen man får för björnarna sparas och kan läsas av. Hur detta ska fungera illustreras av nedanstående exempel:

Antag att vi har tre typer av björnar: brunbjörn, isbjörn och panda som är värda 100, 200 och 300 poäng.

(detta ska likna ett excel ark)
-------------------------------------------------------------------------------------------------
Björntyp vi lägger till | poäng för denna björn | Totalt antal sparade poäng
-------------------------------------------------------------------------------------------------
Brunbjörn |100 |100
-------------------------------------------------------------------------------------------------
Brunbjörn |50 |150
-------------------------------------------------------------------------------------------------
Isbjörn |200 |350
-------------------------------------------------------------------------------------------------
Brunbjörn |25 |375
-------------------------------------------------------------------------------------------------
Panda |300 |675
-------------------------------------------------------------------------------------------------
Isbjörn |100 |776
-------------------------------------------------------------------------------------------------

Poängen vi lägger till kommer alltså från den första björnen vi lade till av en viss typ, inte från eventuella dubbletter vi försöker lägga till senare.

Det ska också läggas till en toString-metod till klassen."

Förövrigt finns denna klass med i samma paket:

public class Bear {
private String name;
private int points;

public Bear(String name, int points) {
this.name = name;
this.points = points;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getPoints() {
int oldPoints = points;
points /= 2;
return oldPoints;
}
}

Någon som kan hjälpa mig på traven? Är oändligt tacksam för all hjälp jag kan få!

//Pannkaksmonstret

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Skrivet av pannkaksmonstret:

Någon som kan hjälpa mig på traven? Är oändligt tacksam för all hjälp jag kan få!

Och vad är det som du fastnat på? Vi gör inte andras läxor här.

Trädvy Permalänk
Medlem
Registrerad
Dec 2002
Skrivet av iXam:

Och vad är det som du fastnat på? Vi gör inte andras läxor här.

Skulle gissa på att TS inte har en aning om vad han skall göra och behöver därför en lite push vart han ska börja?

[size="1"]*signatur raderad*, referrallänkar behöver vi inte gömma i signaturer (§8 marknadsföring)[/size] Till MOD: Ditt smartskafft, man gömmer inte något som är helt synligt!

Trädvy Permalänk
Medlem
Registrerad
Feb 2017
Skrivet av fragwolf:

Skulle gissa på att TS inte har en aning om vad han skall göra och behöver därför en lite push vart han ska börja?

Exakt, har ingen aning om var jag ska börja så att säga, men antar att jag behöver deklarera:
private ArrayList<Bear> bears = new ArrayList<Bear>();
private int totalSavedPoints;

med det lilla jag lärt mig om arraylists så blev jag helt förvirrad av detta, som sagt glad ifall någon kan förklara hur jag ska börja angripa detta. Vill inte ha en lösning, snarare ville jag bara få tips och förklaring på hur jag ska börja att angripa detta.

Allt gott!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2013

Tänk i pseudokod först om det hjälper. Det vill säga, om du kan beskriva vad du vill få gjort innan du vet vad som ska användas för att få det gjort. Sen får du bryta ned saker i mindre bitar som går att söka sig fram till, eller som du vet hur man implementerar i kod.

MSI GTX 970 Gaming | Intel i7 6700K | noctua NH-D15 | ASUS Z170 Pro Gaming | Corsair DDR4 2x8GB LPX | Corsair RM750x | Fractal Design Define R5

Trädvy Permalänk
Medlem
Registrerad
Feb 2017
Skrivet av spjakarn:

Tänk i pseudokod först om det hjälper. Det vill säga, om du kan beskriva vad du vill få gjort innan du vet vad som ska användas för att få det gjort. Sen får du bryta ned saker i mindre bitar som går att söka sig fram till, eller som du vet hur man implementerar i kod.

Tack för bra input, fungerar rätt bra, har listat ut nu att jag behöver använda b.setPoints(b.getPoints()); i "for each loopen" för att ange nya värdet i points för den nya björnen. Nu återstår dock att klura på hur man adderar totalsumman till varje björn, anser ni att den variabeln "int totalSavedPoints" bör vara definierad i BearCollection klassen eller i enbart Bear? Objektorienterat sett borde den ju vara i Bear om jag inte är helt ute och cyklar?

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av pannkaksmonstret:

Tack för bra input, fungerar rätt bra, har listat ut nu att jag behöver använda b.setPoints(b.getPoints()); i "for each loopen" för att ange nya värdet i points för den nya björnen. Nu återstår dock att klura på hur man adderar totalsumman till varje björn, anser ni att den variabeln "int totalSavedPoints" bör vara definierad i BearCollection klassen eller i enbart Bear? Objektorienterat sett borde den ju vara i Bear om jag inte är helt ute och cyklar?

Det finns väl ingen setPoints på Bear? Oavsett låter det poänglöst (ha!) då operationen bokstavligen säger "sätt min poäng till min poäng".

Totalsumman hör inte hemma på Bear. Möjligtvis skulle den passa på BearCollection men den kan lika gärna ligga utanför. Hellre faktiskt, på grund av hur oerhört knäpp getPoints på Bear är. Det är riktigt konstigt att den halverar poängen vid varje anrop: sideffekter som dessa brukar ses som extremt dålig praxis på en getX-metod..

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Feb 2017
Skrivet av Teknocide:

Det finns väl ingen setPoints på Bear? Oavsett låter det poänglöst (ha!) då operationen bokstavligen säger "sätt min poäng till min poäng".

Totalsumman hör inte hemma på Bear. Möjligtvis skulle den passa på BearCollection men den kan lika gärna ligga utanför. Hellre faktiskt, på grund av hur oerhört knäpp getPoints på Bear är. Det är riktigt konstigt att den halverar poängen vid varje anrop: sideffekter som dessa brukar ses som extremt dålig praxis på en getX-metod..

Ah ok, får klura vidare på det!

Borde den inte totalsumman ligga i Bear då varje björn har sin egen totalsumma (se det undermåliga försöket till Excel lista jag försökte skapa!)? Get metoden är så som den ska vara enligt uppgiften, som ni ser i Excel arket ska värdet till varje nya inläsning (lagring) av samma björnnamn halveras.

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004
Skrivet av pannkaksmonstret:

Ah ok, får klura vidare på det!

Borde den inte totalsumman ligga i Bear då varje björn har sin egen totalsumma (se det undermåliga försöket till Excel lista jag försökte skapa!)? Get metoden är så som den ska vara enligt uppgiften, som ni ser i Excel arket ska värdet till varje nya inläsning (lagring) av samma björnnamn halveras.

Enligt listan har de väl en gemensam totalsumma?

P.S: Lägg koden inom [code][/code]-taggar så ser den bättre ut.

Trädvy Permalänk
Medlem
Registrerad
Feb 2017

@Teknocide:

ser detta rimligt ut möjligtvis?

import java.util.ArrayList; public class BearCollection { private ArrayList<Bear> bears; private int totalPoints; public BearCollection() { bears = new ArrayList(); totalPoints = 0; } public void add(Bear b) { for (Bear inCollection : bears) { if (b.getName().equals(inCollection.getName())) { b.getHalfPoints(); } } bears.add(b); totalPoints += b.getPoints(); } public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + " Totalt antal sparade poäng: " + totalPoints + "\n"; } return lista; } }

public class Bear { private String name; private int points; public Bear(String name, int points) { this.name = name; this.points = points; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHalfPoints() { points /= 2; return points; } public int getPoints() { return points; } }

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2008
Skrivet av pannkaksmonstret:

@Teknocide:

ser detta rimligt ut möjligtvis?

import java.util.ArrayList; public class BearCollection { private ArrayList<Bear> bears; private int totalPoints; public BearCollection() { bears = new ArrayList(); totalPoints = 0; } public void add(Bear b) { for (Bear inCollection : bears) { if (b.getName().equals(inCollection.getName())) { b.getHalfPoints(); } } bears.add(b); totalPoints += b.getPoints(); } public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + " Totalt antal sparade poäng: " + totalPoints + "\n"; } return lista; } }

public class Bear { private String name; private int points; public Bear(String name, int points) { this.name = name; this.points = points; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHalfPoints() { points /= 2; return points; } public int getPoints() { return points; } }

Du är på god väg.
När du skriver ut listan efter att ha lagt till alla björnar, då kommer totalPoints att vara det slutgiltiga värdet.

Genom att bara skapa och lägga till björnar fick jag utskriften:

Björntyp: Brunbjörn Poäng för denna björn: 100 Totalt antal sparade poäng: 775 Björntyp: Brunbjörn Poäng för denna björn: 50 Totalt antal sparade poäng: 775 Björntyp: Isbjörn Poäng för denna björn: 200 Totalt antal sparade poäng: 775 Björntyp: Brunbjörn Poäng för denna björn: 25 Totalt antal sparade poäng: 775 Björntyp: Panda Poäng för denna björn: 300 Totalt antal sparade poäng: 775 Björntyp: Isbjörn Poäng för denna björn: 100 Totalt antal sparade poäng: 775

men med en liten modifikation fick jag istället:

Added bear: Brunbjörn which is worth: 100 points. Total points is now: 100 Added bear: Brunbjörn which is worth: 50 points. Total points is now: 150 Added bear: Isbjörn which is worth: 200 points. Total points is now: 350 Added bear: Brunbjörn which is worth: 25 points. Total points is now: 375 Added bear: Panda which is worth: 300 points. Total points is now: 675 Added bear: Isbjörn which is worth: 100 points. Total points is now: 775

Värdet på björnarna är baserat på listan du skrev i din första post.

Edit:
Med andra ord, beräkningarna fungerar som de ska, men presentationen blir galen

Dator 1: i7 5820k | Asus X99-S | 16GB DDR4 | GTX 1080ti SLI | NZXT H440
Dator 2: i7 5820k | Asrock X99M | 32GB DDR4 | GTX 970 | SC-512N1-L Capture Card | Fractal Design Node 804
Skärm:Philips BDM4065UC
Mixer: Behringer X2222USB
Mina bästa tider inom speedruns

Trädvy Permalänk
Medlem
Registrerad
Feb 2017
Skrivet av MaxieTheHatter:

Du är på god väg.
När du skriver ut listan efter att ha lagt till alla björnar, då kommer totalPoints att vara det slutgiltiga värdet.

Genom att bara skapa och lägga till björnar fick jag utskriften:

Björntyp: Brunbjörn Poäng för denna björn: 100 Totalt antal sparade poäng: 775 Björntyp: Brunbjörn Poäng för denna björn: 50 Totalt antal sparade poäng: 775 Björntyp: Isbjörn Poäng för denna björn: 200 Totalt antal sparade poäng: 775 Björntyp: Brunbjörn Poäng för denna björn: 25 Totalt antal sparade poäng: 775 Björntyp: Panda Poäng för denna björn: 300 Totalt antal sparade poäng: 775 Björntyp: Isbjörn Poäng för denna björn: 100 Totalt antal sparade poäng: 775

men med en liten modifikation fick jag istället:

Added bear: Brunbjörn which is worth: 100 points. Total points is now: 100 Added bear: Brunbjörn which is worth: 50 points. Total points is now: 150 Added bear: Isbjörn which is worth: 200 points. Total points is now: 350 Added bear: Brunbjörn which is worth: 25 points. Total points is now: 375 Added bear: Panda which is worth: 300 points. Total points is now: 675 Added bear: Isbjörn which is worth: 100 points. Total points is now: 775

Värdet på björnarna är baserat på listan du skrev i din första post.

Edit:
Med andra ord, beräkningarna fungerar som de ska, men presentationen blir galen

Ah, hur ska jag modifiera toSring för att få resultatet i ditt exempel? Behöver jag ha totalPoints som variabel hos Bear klassen (så varje björn har en unik total points)?

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2008
Skrivet av pannkaksmonstret:

Ah, hur ska jag modifiera toSring för att få resultatet i ditt exempel? Behöver jag ha totalPoints som variabel hos Bear klassen (så varje björn har en unik total points)?

Skickades från m.sweclockers.com

totalPoints kan gott ligga kvar i BearCollection, fundera över ett sätt du kan spara värdena i, gärna med samma index som björnen i fråga.

Ändrade lite på min lösning och fick toString() att skriva ut rätt värden den också.

Ett löst tips kan vara att kolla på hur björnarna lagras

Dator 1: i7 5820k | Asus X99-S | 16GB DDR4 | GTX 1080ti SLI | NZXT H440
Dator 2: i7 5820k | Asrock X99M | 32GB DDR4 | GTX 970 | SC-512N1-L Capture Card | Fractal Design Node 804
Skärm:Philips BDM4065UC
Mixer: Behringer X2222USB
Mina bästa tider inom speedruns

Trädvy Permalänk
Medlem
Registrerad
Feb 2017

@MaxieTheHatter: Har dock insett en sak, toString metoden ska inte motsvara den tabellen som är i början, den ska bara visa hur totalpoängen förändras när man lägger till en björn. Därav blir min lösning rätt, dar dock ändrat nu på toString metoden så att totalpoängen skrivs ut efter alla björnar och deras individuella poäng!

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av pannkaksmonstret:

@Teknocide:

ser detta rimligt ut möjligtvis?

import java.util.ArrayList; public class BearCollection { private ArrayList<Bear> bears; private int totalPoints; public BearCollection() { bears = new ArrayList(); totalPoints = 0; } public void add(Bear b) { for (Bear inCollection : bears) { if (b.getName().equals(inCollection.getName())) { b.getHalfPoints(); } } bears.add(b); totalPoints += b.getPoints(); } public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + " Totalt antal sparade poäng: " + totalPoints + "\n"; } return lista; } }

public class Bear { private String name; private int points; public Bear(String name, int points) { this.name = name; this.points = points; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getHalfPoints() { points /= 2; return points; } public int getPoints() { return points; } }

Tycker du kan byta namn på metoden getHalfPoints till något i stil med setPointsToHalf() och låta den returnera void då du inte är intresserad av utdatan.

Du kan även använda samma for … in … -loop i toString() som du använder i add(), det ser snyggare ut och du använder inte indexet i utskriften ändå.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Feb 2017

@Teknocide:
Såhär antar jag att det blir?

import java.util.ArrayList; public class BearCollection { private ArrayList<Bear> bears = new ArrayList(); private int totalPoints; public void add(Bear b) { for (Bear inCollection : bears) { if (b.getName().equals(inCollection.getName())) { b.setPointsToHalf(inCollection.getPoints()); } } bears.add(b); totalPoints += b.getPoints(); } public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + "\n"; } lista += " Totalt antal sparade poäng: " + totalPoints; return lista; } }

public class Bear { private String name; private int points; public Bear(String name, int points) { this.name = name; this.points = points; } public String getName() { return name; } public void setName(String name) { this.name = name; } // public int getHalfPoints() { // points /= 2; // return points; // } public void setPointsToHalf(int points) { points /= 2; this.points=points; } public int getPoints() { return points; } }

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av pannkaksmonstret:

@Teknocide:
Såhär antar jag att det blir?

public String toString(){ String lista = ""; for (int i = 0 ; i < bears.size(); i++ ){ lista += "Björntyp: " + bears.get(i).getName() + " Poäng för denna björn: " + bears.get(i).getPoints() + "\n"; } lista += " Totalt antal sparade poäng: " + totalPoints; return lista; }

Här menar jag att du kan använda en foreach: for (Bear b : bears) { … istället för en klassisk for-loop. Du använder redan samma sorts for-loop i add, ser ingen anledning till att byta här.

Citat:

public void setPointsToHalf(int points) { points /= 2; this.points=points; }

Jag tycker det är förvirrande att du tar in en poäng här. Det blir en matteuppgift av det hela, om jag vill att björnen ska ha 160 poäng måste jag anropa setPointsToHalf(320). Känns inte jättelogiskt att någon skulle vilja göra så.

Björnen har redan en poäng, det är bara att halvera den: this.points = this.points / 2

Sedan skulle jag personligen aldrig haft någon metod på Bear som halverade dess poäng: Det gör att en björn inte kan finnas med i två separata björnlistor eftersom dess individuella poäng sjunker varje gång den läggs till. Kan förstå att du måste göra så om uppgiften kräver det, men det är ingen bra lösning. Jag skyller på kursmaterialet.

Bilanaloger är som Volvo — varenda svenne kör med dem