Permalänk

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

Permalänk
Medlem
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.

Permalänk
Medlem
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?

Visa signatur

.

Permalänk
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!

Permalänk
Medlem

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.

Permalänk
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?

Permalänk
Medlem
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..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
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.

Permalänk
Medlem
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.

Permalänk

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

Permalänk
Medlem
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

Visa signatur

Stationär: Core i9 13900k | Asus X790 ROG Strix Gaming-F | 32GB DDR5 | RX 7900 XT | Lian Li PC-O11 dynamic evo
Laptop: Macbook Air | Apple M1

Permalänk
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

Permalänk
Medlem
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

Visa signatur

Stationär: Core i9 13900k | Asus X790 ROG Strix Gaming-F | 32GB DDR5 | RX 7900 XT | Lian Li PC-O11 dynamic evo
Laptop: Macbook Air | Apple M1

Permalänk

@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!

Permalänk
Medlem
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å.

Visa signatur

Kom-pa-TI-bilitet

Permalänk

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

Permalänk
Medlem
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.

Visa signatur

Kom-pa-TI-bilitet