Stimmen diese Methoden für meine ArrayList?

Klasse 1 - (programmieren, Informatik, Java) Klasse 2 - (programmieren, Informatik, Java)

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ah du schon wieder ;)

Ok...

Nur mal vorneweg, du hast ganz schönen Mist geschrieben...

Erstens:

Die Methode "anzahlImSpeicher" ist ziemlich sinnentleert...

Du übergibst ihr einen String "gesuchtes Produkt", was du aber völlig ignorierst und einfach nur die Gesamtgröße der ArrayList zurückgibst.

Das ist natürlich falsch...

So, nun machen wir das mal richtig...

Eine Musterlösung von mir würde so aussehen:

public int anzahlImSpeicher(String gesuchtesProdukt)
{
   int result = 0  //Hier wird das Endergebnis gespeichert


   // Was hier kommt ist eine sogennante "erweiterte for-Schleife
   // Sie macht nichts anderes, als für jedes Produkt in deiner
   // ArrayList einen Durchlauf vom Rumpf für jedes enthaltene
   // Element zu machen

   // Sieh den Kopf dieser Schleife so:
   // for(Produkt produkt : produkte) bedeutet in etwa:
   // Für jedes "produkt" in "produkte" wird der Rumpf ausgeführt...
   for(Produkt produkt : produkte)
   {
      // Strings IMMER mit der .equals()-Methode vergleichen !!!!
      if(produkt.getname().equals("gesuchtesProdukt")
      {
         result++;
      }
      // Wir schauen für jedes einzelne Objekt in der Liste,
      // ob es unser gesuchtes ist. Falls dies zutrifft, erhöhen
      // wir den Zähler um Eins und geben ihn am Ende aus.
   }
   return result
}

So viel dazu...

Und nein, deine entfernen-Methode ist NICHT richtig...

Du möchtest jetzt aus deiner ArrayList von Produktobjekten ein gewisses Objekt entfernen, indem du einen String angibst, der den Namen von dem zu entfernenden Objekt repräsentiert. Dann kannst du der ArrayList nicht einfach einen String geben, den er entfernen soll, das kann er auch gar nicht, er hält ja nur Produkt-Objekte und keine Strings. Das musst du irgendwie berücksichtigen.

...

Und für den Rest bin ich gerade irgendwie zu faul xD


PS: Das, was ihr da macht ist echt hässlich. Normalerweise, würde man nie im Leben Strings als Namen übergeben, weil dann so ein Mist wie beim entfernen zum Problem wird, sondern gleich ganze Produkt-Objekte, wie du es ja auch bei der Methode "fuegeHinzu" gemacht hast, das hat aber leider auch einen ganz guten Grund, also musst du da auch leider durch ;)


Plokapier  19.05.2017, 19:00

Wenn du willst, helfe ich dir auch mit dem Rest, sag einfach Bescheid, oder wenn du Fragen hast.

1
Ranaros 
Beitragsersteller
 19.05.2017, 21:05
@Plokapier

Hi :) Ja ist echt schwer sich das alles selbst beizubringen :/ Mein Professor erklärt das zwar alles gut, vergisst aber ständig alles hochzuladen, habe also wenig Vorlesungscode zum üben.

Das mit der For each Schleife kommt mir sehr bekannt vor, ich verstehe das auch alles und blicke auch sehr gut durch den code durch, mein Problem ist nur, dass ich nie selbst drauf komme. Meinen Freundeskreis kann ich auch nicht wirklich gut fragen, da manche noch garnicht so weit sind oder was anderes Studieren, Medieninformatik oder so und dann andere Aufgaben bekommen.

Naja, ich habe mal versucht deinen code einzusetzen, komme aber bei manchen Methoden immer noch nicht weiter, warum ist denn die entferneProdukt Methode falsch? In der Vorlesung wurde das auch so gemacht, nur mit Personen, also Person betritt Raum oder sowas. Ist denn die andere richtig? Er geht ja jetzt jedes Produkt durch und wenn er das unerwünschte Produkt findet, löscht er das. Geht das so?

Und wie gehe ich am besten die Verkaufsmethode an? Ich wüsste so gerade, wie man die ArrayList leeren könnte, wie man aber jetzt den gesamtverkaufswert berechnet, weiß ich nicht, da es ja verschiedene Produkte sein könnten. Wäre echt nett, wenn du mir da ein wenig helfen würdest :)


package unternehmen;

import java.util.ArrayList;

public class Warenspeicher {

private ArrayList produkte = new ArrayList ();

public void fuegeProduktHinzu(Produkt produkt) {
produkte.add(produkt);
}
public int anzahlImSpeicher(String gesuchtesProdukt) {
int result = 0;
for(Produkt produkt : produkte) {
if(produkt.getname().equals(gesuchtesProdukt)) {
result ++;
}
}
return result;
}

public void entferneProdukt(String unerwuenschtesProdukt) {
produkte.remove(unerwuenschtesProdukt);
}

public void entferneProdukt(String unerwuenschtesProdukt, int anzahl) {
for(Produkt produkt : produkte) {
if(produkt.getname().equals(unerwuenschtesProdukt)) {
produkte.remove(unerwuenschtesProdukt);
}
}
}
public int warenVerkaufen() {


}
}
0
regex9  19.05.2017, 21:33
@Ranaros

1) Kaufe dir mal ein Buch. Übungsbeispiele findest du ebenso genügend im Internet, sofern du dich nicht an YouTube-Videos orientierst.

2) Du darfst auch nicht damit beginnen, alles sofort in Programmcode übernehmen zu wollen. Das ist sonst nämlich nur billiges Rumhacken und das soll kein Verfahren für die Anwendungsentwicklung sein. Skizziere dir Probleme oder versuche sie grafisch darzustellen. Z.B. mit einem Kartenspiel (für Listen, Sortierung, o.ä.). Definiere dein Problem eindeutig und teile es in Teilprobleme auf. Solange, bis du jedes einzelne Teilproblem einfach lösen kannst.

3) Medieninformatiker müssen sich genauso mit der Programmierung beschäftigen, sie wären also ebenso eine gute Adresse.

4) Dein Vorgehen ist zumindest schon einmal richtig. Aber unerwuenschtesProdukt ist nach wie vor ein String, kein Produkt. Nicht umsonst hast du doch den Produktnamen mit unerwuenschtesProdukt verglichen.

for(Produkt produkt : produkte) {
  if(produkte.getname().equals(unerwuenschtesProdukt)) {
    produkte.remove(produkt);
    break; // je nach Anforderung
  }
}

Wenn die Aufgabe es fordert, dass alle Vorkommen von unerwuenschtesProdukt aus der Liste entfernt werden, dann entferne das break. Andernfalls sorgt es dafür, dass die Schleife vorzeitig aufhört und so nicht unnötige Iterationen vornimmt, nachdem das gewünschte Ergebnis bereits erreicht wurde (Löschen des 1. Fundes).

5.) Siehe meine Antwort unten oder oben.^^

1
Plokapier  19.05.2017, 21:39
@Ranaros

Eins nach dem anderen.

Sehen wir uns mal entferneProdukt an.

Was du da hast, ist erst mal Quatsch. Du kannst nicht den remove-Befehl machen mit einem String im Parameter, wenn du eine ArrayList von Produkt-Objekten hast.

Du hast ja eine ArrayList von Produkten. Und jetzt willst du Produkte deiner Wahl entfernen. Und zwar basierend auf dem Wert des Strings, den sie in ihrer Instanzvariable "Name" halten. Diesen String übergibst du im Parameter.

Also kannst du dir jetzt vielleicht auch selber denken, was jetzt kommt...

Du musst jedes einzelne Objekt überprüfen, ob es das ist, was entfernt werden soll und es dann entfernen. Wenn du mehrere entfernen willst, dann halt auch in einer Schleife.

Gegeben hast du ja meinen Beispielcode oben, das, was du jetzt machen könntest und ich im Sinn habe, sieht so ähnlich aus, das könntest du ja dann mal versuchen ^^

1
Ranaros 
Beitragsersteller
 19.05.2017, 21:42
@regex9

Ja ich verstehe :D ich muss mich da noch ein bisschen mehr erkundigen, ich habe das Buch "Java ist auch eine Insel" vielleicht sollte ich da mal einen Blick reinwerfen. Die MI´s kann ich aber echt vergessen, die haben genug mit ihrer eigenen Aufgabe zu tun, die müssen in diesem Jahr ein Spiel programmieren, also ziemlich abweichend zu uns AI´s

0
Ranaros 
Beitragsersteller
 19.05.2017, 22:09
@Plokapier
public void entferneProdukt(String unerwuenschtesProdukt, int anzahl) {

for(int i = 1; i < produkte.size(); i++) {
if(unerwuenschtesProdukt.equals(i)) {
produkte.remove(i);

Meinst du sowas? Ich durchlaufe jetzt eine Schleife, sobald das unerwünschte Wort gleich i ist, wird dieses entfernt. Ob das jetzt richtig ist weiß ich nicht, starten kann ich es ja noch nicht, ich habe ja noch keine main methode. 

0
regex9  19.05.2017, 22:26
@Ranaros

Zum Testen musst du das Programm nicht starten. Setze doch Testwerte ein und laufe den Code selbst im Kopf durch (oder mit einem Zettel daneben, auf dem du dir Teilergebnisse aufschreibst).

Dein Quellcode ist falsch. Sowohl in der Logik als auch in der Syntax.

  • Deine Gruppierungen werden nicht geschlossen
  • Der 2. Parameter ist ungenutzt, also auch unnötig
  • Wieso beginnst du bei 1?
  • Wieso vergleichst du deinen Produktnamen mit einer Zahl?

Du musst dir wohl oder übel Gedanken über das machen, was du schreibst. Und zwar im Vorfeld.

1
regex9  19.05.2017, 22:34
@Ranaros

Spieleprogrammierung ist auch nur Software-Entwicklung. Hier liegt nicht das Problem unterschiedlicher Thematiken vor, sondern wenn nur der zeitliche Aspekt.

Ich denke, es wird genügend Tutoren, Kommilitonen oder Dozenten geben, die dir helfen würden. Du musst nur deine eigene Hürde überwinden und die Leute fragen. Ansonsten kannst du dich auch in andere Vorlesungen oder Tutorien setzen, um Grundlagen zu wiederholen oder zu vertiefen.

2
Plokapier  19.05.2017, 22:42
@Ranaros

Das sieht schon besser aus...

ist aber immer noch Quatsch...

if(unerwuenschtesProdukt.equals(i))

Du vergleichst hiereinen String mit einem int. Das ist daneben. Was du machen willst, ist den String "unerwünschtes Produkt" mit dem Namen des aktuell im Visier der for-Schleife enthaltenen Namen zu vergleichen.

Also eher:

if(unerwuenschtesProdukt.equals(produkt[i].getname))


Du kannst hier auch die erweiterte for-Schleife benutzen. Musst du aber nicht, wenn dich das jetzt noch verwirrt.

Und du fängst auch nicht bei 1 an. Du müsstest eigentlich wissen, dass, wenn du ein Array für z.B. 5 ints anlegst, du den Index von 0 bis 4 ansetzen kannst. Das gilt für die ArrayList genauso.

Also:

for(int i = 0; i < produkte.size(); i++)

Noch was:

Mach dir mal klar, was du hier machst! Du gehst jetzt jedes einzelne Objekt der Liste durch und prüfst, ob der Name zutrifft und entfernst es dann. Im Endeffekt bedeutet das, dass du ALLE Objekte, die meinetwegen Apfel entfernst, statt nur so viele zu entfernen, wie du es eigentlich im Parameter übergibst. Da musst du noch was machen (Ich denke eine Schleife außenrum wäre hier sinnvoll)

Noch mal:



public void entferneProdukt(String unerwuenschtesProdukt, int anzahl) {

for(int i = 0; i < produkte.size(); i++) {
if(unerwuenschtesProdukt.equals(produkt[i]).getname) {
produkte.remove(produkt[i]); } } //Achte darauf Klammern zu zumachen


Und NOCH etwas... etwas ziemlich wichtiges finde ich...

Ich finde es fatal, Code schreiben zu wollen, ohne ihn selber auszuführen und zu testen! Es bringt dir wirklich NICHTS, Code zu schreiben ohne ihn auszuführen. Egal, wie gut du im Programmieren bist, oder wieviel Erfahrung du hast, wenn jemand Code schreibt, ohne ihn überhaupt auszuführen, wird er 90prozentig nicht korrekt laufen oder gar übersetzbar sein. Lernen tust du dabei auch nichts. Jetzt mal ehrlich. Das ist doch ein absoluter Alptraum, was du da machst. Schreib gefälligst eine main-Methode und führe deinen eigenen Code aus, damit du überhaupt weißt, was du da machst. Dir muss doch auch auffallen, was für einen Mist du hier machst. Du übergibst Strings an ein Array von Produkten. Du vergleichst Zahlen mit Wörtern....

Wenn du deinen Code nicht selber ausführst, ist es praktisch dasselbe, wie wenn du allein mit Stift und Papier programmierst. Und du wirst mir wohl sicher zustimmen, wenn ich sage, dass das absurd ist und niemand etwas daraus lernt.

Also:

Führe deinen Code aus und teste ihn! Es gibt eine Konsole, die genau dafür gut ist!







1
Ranaros 
Beitragsersteller
 20.05.2017, 16:17
@Plokapier

Meine Klasse sieht jetzt so aus: 

https://hastebin.com/uwizofoxid.java

Ich habe es versucht zu testen, indem ich meine main methode erstellt und dann was übergeben habe, hat mir aber nicht wirklich viel geholfen, in der Aufgabe steht, dass ich die zum Schluss erstellen soll, ist glaube ich auch erstmal für mich besser, da mir die Fehlermeldungen eh nicht viel bringen. Ich bin einfach gedanklich nochmal alles durchgegangen und finde jetzt eigentlich keinen Fehler mehr.

Achja, das mit der 0 ist mir gestern selbst aufgefallen. Das mit dem 



unerwuenschtesProdukt.equals(i)


mache ich normalerweise nicht, jetzt im nachhinein war das echt blöd.

Noch eine zusätzliche Frage: In der Aufgabenstellung steht:"Erstellen Sie einen Konstruktor ohne Übergabeparameter, in dem die ArrayList initialisiert wird" Habe ich das gemacht? Oder sollte ich sowas wie:

public produkte() {                  

}

schreiben?. Im moment versuche ich irgendwie die verkaufen Methode hinzubekommen, habe aber noch keinen Ansatz. Ich weiß, dass ich die Produkte mit dem gleichen Namen zusammenzählen und das dann mit dem Verkaufswert verrechnen muss. Das wird dann mit den anderen Produkten zusammen addiert. Wie ich das aber jetzt in Code umwandlen kann weiß ich nicht. 

0
Plokapier  20.05.2017, 17:18
@Ranaros

Wenn in der Aufgabenstellung steht, dass du einen Konstruktor schreiben sollst, der die ArrayList initialisiert, dann ist damit bestimmt nicht die Klasse Produkt gemeint, sondern die Klasse "Warenspeicher", die ja auch die ArrayList als Instanzvariable hält (ist auch ihre einzige). Es wäre ziemlich sinnlos, einen parameterlosen Konstruktor für ein Produkt zu haben. Mach dir mal selber klar, wieso.

Im Code oben hast du die ArrayList gleich bei der Deklaration intialisiert:

private ArrayList<Produkt> _produkte = new ArrayList<Produkt>();

Jetzt heißt es aber, die soll in einen parameterlosen Konstruktor. Also:

private ArrayList<Produkt> _produkte;

public Warenspeicher()
{
   _produkte = new ArrayList<Produkte>();
}
1
Ranaros 
Beitragsersteller
 20.05.2017, 17:42
@Plokapier

muss es nicht 

   _produkte = new ArrayList<Produkt>();

heißen? Ist ja eigentlich wie vorher(?).

Ansonsten habe ich das jetzt auch verstanden, sind meine lösch- Methoden denn jetzt richtig? Und was genau sollte ich bei der verkauf- Methode schreiben? Ich weiß, wie man die ArrayList leeren kann, wie man das alles zusammenrechnet weiß ich nicht.

0
Plokapier  20.05.2017, 17:49
@Ranaros

Nein! Du sollst die ArrayList im Konstruktor initialisieren!

In der Aufgabenstellung steht:"Erstellen Sie einen Konstruktor ohne Übergabeparameter, in dem die ArrayList initialisiert wird"

Also lass das mal so.

1
Ranaros 
Beitragsersteller
 20.05.2017, 17:53
@Plokapier
private ArrayList <Produkt> produkte;


public Warenspeicher() {
produkte = new ArrayList <Produkt>();
}

Ich meine das so, du hast oben Produkte in die eckigen Klammern geschrieben. Das wird bei mir aber als Fehler markiert. Vorher war das ja auch Produkt.

0
Ranaros 
Beitragsersteller
 20.05.2017, 18:04
@Ranaros

Kannst du mir vielleicht noch bei etwas anderem helfen? Ich sollte jetzt eine neue Klasse namens Fabrik erstellen, dazu neue variablen, einen Konstruktor und Getter Methoden. Dazu soll ich jetzt wieder Methoden schreiben, die relativ ähnlich zu den alten sind. Bei der ersten steht aber zusätzlich zum add Teil "Vorher muss sie jedoch die setFabrik Methode der maschine aufrufen und sich selber übergeben" Mit maschine ist glaube ich die Methode selbst gemeint die das ausführen soll, die heißt fuegeMaschineHinzu(Maschine maschine). Wie mache ich das am besten? Ich habe doch noch garkeine Set Methode und wie soll man die Methode dann selbst übergeben? :/ Die darauffolgenden Methoden verstehe ich alle.

0
Plokapier  20.05.2017, 18:48
@Ranaros

Das hier ist echt klobig und ich weiß auch nicht, ob dir das hier wirklich so viel weiterhilft, als wenn du mal Kommilitonen aus deiner Gruppe oder auch aus höheren Semestern fragen würdest. Ich empfehle dir wirklich, dir jemanden zu suchen, der das alles mehr oder weniger locker draufhat, dich mal einen Abend mit ihm hinzusetzen und das zu machen. Ein Tutorium wär auch perfekt.

Denn so ist das echt schwierig, am liebsten würde ich das mit dir persönlich machen, weil du dann einfach mehr davon hättest. Sieh dich mal um. Du findest bestimmt ein paar hilfsbereite Kollegen.

0
Ranaros 
Beitragsersteller
 20.05.2017, 19:32
@Plokapier

Ja da hast du wohl recht, wie gesagt, in meinem Umkreis befinden sich zu viele die zu faul sind oder so viel können wie ich :D Für diese Aufgaben beginnen bald die Tutorien, die sollte ich aufjedenfall mal wahrnehmen..

Danke aber für deine Hilfe :)

0

Was ich nicht ganz verstehe ist, wieso du dein Programm nicht einfach mal testest, wenn du dir unsicher bist, ob es richtig funktioniert. Die Fehlermeldungen, die im unteren Fenster Problems angezeigt werden, ignorierst du wohl lieber. 😐

1) Also testen.

2) Ja, das ist falsch. Wenn du einen Korb voller Obst hast und nur die Anzahl an Birnen aus diesem haben möchtest, kannst du nicht einfach die Anzahl aller Früchte zurückgeben. Stattdessen musst du jede Frucht einzeln aus dem Korb nehmen, prüfen, ob es eine Birne ist und je nachdem deiner Strichliste einen Strich hinzufügen. Am Ende zählst du alle Striche zusammen.

3) Nein. Deine Liste enthält Produkte, keine Strings. Dies wird durch den generischen Typ abgesichert.

ArrayList<Produkt> produkte;

Bezogen auf mein obiges Obstbeispiel:

Ein Händler steht vor dir mit einem Obstkorb und stellt die Regel auf: Hier, in diesen Korb, dürfen nur Früchte hinein, nichts anderes. Dann kannst du dich darauf verlassen, dass darin nur Früchte sind. Solltest du auf die Idee kommen, stattdessen ein Spielzeugauto z.B. hineinlegen zu wollen, verstößt du gegen das Fruchtkorbgesetz. Wenn du den Händler darum bittest, bspw. ein Spielzeugauto aus dem Korb herauszugeben, wird er nicht wissen, was du von ihm willst. Er erwartet nur Früchte in dem Korb.

4) 

(...) ich glaube allerdings, dass das falsch ist.

Und wieso glaubst du das? Was meinst du, wird daran falsch sein, was musst du möglicherweise ändern?

5)

Stell dir vor, du hättest in einem Korb Rechnungen liegen. Auf denen steht der Name eines Produkts sowie dessen Preis. Wie würdest du denn nun den Gesamtpreis aller Rechnungen berechnen? Es geht mir bei dieser Frage vorerst nur um die Arbeitsschritte, nicht um die konkrete Umsetzung im Programmcode.