Bestellannahme

R

rave1989

Gast
Hi Leute,

Für ein Projekt soll ich in Java ein Programm schreiben, das in der Lage sein soll Bestellungen aufzunehmen.
(Ich Benutze NetBeans 6.9.1 JDK1.7)

-Eine Bestellung besteht dabei aus mehreren Bestellpositionen.
-Eine Bestellposition besteht aus Artikeln und der Anzahl.
-Jede Bestellung muss einem Kunden Zugeordnet werden, Jede Bestellposition einer Bestellung.
-Es sollen Später mit einem aufruf einer Bestellung, alle Bestellpositionen herausgegeben werden .

Das ist nur ein kleiner Auszug aus dem gesamten Projekt, an dem ich allerdings am verzweifeln bin.

Als Tip wurde uns gesagt das wir zwei Klassen erstellen sollen, "Bestellung" und "Bestellposition".

Meine Idee war es bis gerade eben:

Ich sorge erst dafür das über einen Konstruktor der "Bestellposition(int artikel-Id, int anzahl)" solange neue Bestellpositionen erstellt werden, wie der Kunde neue artikel fordert. Am ende werden diese Bestellpositionen dann in eine Arrayliste der Bestellung übernommen, in der dann noch jeweils die Zugehörige Kunden-ID und uhrzeit mit aufgenommen werden. "Bestellund(Bestellposition bestellposition, int uhrzeit, int kundenId)"

Bis jetzt kann ich:

Am anfang der Bestellung den Kunden anhand der KundenId aus der Arrayliste heraussuchen(und theoretisch später in die Bestellung einbinden)
Die artikel anhand der ID heraussuchen und mit der Anzahl versehen.

Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.

Ich bitte euch also um Erfahrungen und Ideen zu der Problemstellung bzw. Ergänzungen zum lösen meines Ansatzes.
 
Zuletzt bearbeitet von einem Moderator:
R

rave1989

Gast
Nachtrag1: Also eine Bestellung muss später etwa so aussehen:

BestellID
Artikel1, Anzahl
Artikel2, Anzahl
KundenID, uhrzeit der Lieferung.

Wichtig ist noch die Behandlung des Preises der einzelnen Bestellpositionen.
Denn irgendwie muss ich diesen später noch benutzen um eine Rechnung zu erstellen. Bzw einen Tagesabschluss mit erzieltem Umsatz usw. Aber das kommt später...
 

langhaar!

Bekanntes Mitglied
Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.

In deine Klasse Bestellung kommt eine Methode um Positionen hinzuzufügen z.B. addOrderLine(OrderLine newOrderLine) und eine Liste (z.B. List<OrderLine> orderList), die alle Positionen aufnimmt. Fertig.
 
R

rave1989

Gast
Ich verstehe das nicht...

dann ist doch jedes Objekt der Klasse Bestellung meine eigentliche Bestellposition. Und dann bin ich wieder bei dem Problem das meine Bestellung nur einen Artikel aufnehmen kann.

Beschreibe das bitte etwas genauer.
 

Michael...

Top Contributor
Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.
Keine Ahnung was das mit Konstruktoren zu tun hat, aber Du benutzt doch scheinbar schon eine ArrayList für die Kunden. Dann müsstest Du doch wissen, dass ArrayList eine flexible Anzahl an Objekten aufnehmen kann.
 
R

rave1989

Gast
Das die arrayliste flexibel ist, ist mir klar.

Allerdings verstehe ich nicht wie ich das nun zusammensetzen soll.

Also nochmal, ich erstelle Bestellpositionen, mit der klasse Bestellposition, und lege diese in eine arrayliste ab, soweit alles kein problem.

Jetzt möchte ich mit der Klasse Bestellung eine einzige Bestellung erstellen, sozusagen die Rechnung, die dann Alle Bestellpositionen vereint und unter eine ID aufnimmt.

Da ich am Anfang noch nicht weiß wie viele Bestellpositionen ich haben werde, weiß ich somit nicht wie mein Konstruktor der "Bestellung" aussehen soll.

Wenn ich es wüsste (Beispiel es sind zwei Bestellpositionen) hätte ich gesagt KonstruktorBestellung( bestellposition1, bestellposition2, kundenID, uhzeit)


Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?

Also das ist mein Ansatz und ich vermute, dass dieser so nicht korrekt ist. Aber mir fehlt einfach die Erfahrung mit Java um einen besseren zu erstellen...
 
R

rave1989

Gast
Also ich glaube ich habe es noch nicht erwähnt, aber ich bin ein absoluter Anfänger und es ist gut möglich das ich irgendwelche Begriffe durcheinander bringe. Wenn ihr also nicht versteht was ich eigentlich will, sagt mir das bitte, ich versuche es dann nochmal anders zu erklären.

Das was ich gerade programmiere, ist auch das allererste mal überhaupt für mich! Und das alles nach kurzer Einführung in der uni, Rest sollen wir uns selbst beibringen...
 

langhaar!

Bekanntes Mitglied
Wenn ihr also nicht versteht was ich eigentlich will, sagt mir das bitte, ich versuche es dann nochmal anders zu erklären.

Was du willst, ist vollkommen klar und relativ einfach. Warum machst du es nicht einfach mal so, wie ich es dir vorgeschlagen habe?

Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?

Du hast anscheinend das Konstrukt nicht ganz verstanden.
Jede Bestellung hat eine Liste mit den zugehörigen Positionen. Da werden nicht 'alle möglichen Bestellpositionen' durcheinandergeschmissen.

Vielleicht nimmst du dir erst mal Zettel und Stift und malst das mal aus?


Bestellung 1

Bestellung 2

Bestellung 3

Bestellung 4 etc.

Jetzt könnte bespielsweise in Bestellung 3 eine Liste mit 3 Positionen und in Bestellung 2 eine Liste mit 2 Positionen sein. Dadurch, dass die Listen in den jeweiligen Bestellungen enthalten sind, sind die Positionen fest den Bestellungen zugeordnet. Probiers einfach aus.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Da ich am Anfang noch nicht weiß wie viele Bestellpositionen ich haben werde, weiß ich somit nicht wie mein Konstruktor der "Bestellung" aussehen soll.

Wenn ich es wüsste (Beispiel es sind zwei Bestellpositionen) hätte ich gesagt KonstruktorBestellung( bestellposition1, bestellposition2, kundenID, uhzeit)
Die Anzahl der Bestellpositionen ist doch am Anfang egal. Der Konstruktor könnte so aussehen
Java:
public Bestellung(int kundenID, Date datum)

Ich würde da allgemein noch einmal darüber nachdenken.
Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?
Die Klasse Bestellung benötigt natürlich eine List o.ä. um die Bestellpositionen aufzunehmen. Also nicht eine ArrayList für alle Bestellpositionen sondern eine pro Bestellung eine ArrayList
Aber mir fehlt einfach die Erfahrung mit Java um einen besseren zu erstellen...
Grundsätzlich würde ich mich ersteinmal von Java lösen und überlegen wie so eine Bestellung strukturiert sein könnte bzw. Bestellungen, Warenkörbe... anschauen und analysieren woraus sie bestehen.
 

rave1989

Mitglied
also ich mache es doch so wie du beschrieben hast, nur eben mit der Bestellposition. Es bringt mich aber nicht weiter. Bzw verstehe ich nicht wie ich dann weiter vorgehen soll.

Im moment habe ich eine theoretisch unendliche anzahl an Bestellpositionen, die ich keiner bestimmten Bestellung zuordnen kann.

Nach deinem Ansatz hätte ich eine unendliche menge an orderlines ohne eine definierte Bestellung.

Also das gleiche Problem mit einem anderen Namen!? Oder ich verstehe es einfach falsch...


edit, ich glaube jetzt hat es klick gemacht.

Bis jetzt habe ich die listen jeweils in der Verwaltungsklasse erstellt.
Ich müsste aber eine in der Bestellung(klasse) erstellen, die dann für jede einzelne Bestellung erstellt wird. Okay muss ich mal ausprobieren...
 
Zuletzt bearbeitet:

langhaar!

Bekanntes Mitglied
also ich mache es doch so wie du beschrieben hast, nur eben mit der Bestellposition. Es bringt mich aber nicht weiter. Bzw verstehe ich nicht wie ich dann weiter vorgehen soll.

Im moment habe ich eine theoretisch unendliche anzahl an Bestellpositionen, die ich keiner bestimmten Bestellung zuordnen kann.

Nach deinem Ansatz hätte ich eine unendliche menge an orderlines ohne eine definierte Bestellung.

Also das gleiche Problem mit einem anderen Namen!? Oder ich verstehe es einfach falsch...

Lies dir noch mal in Ruhe die Beiträge durch. Die Fragen wurden bereits beantwortet. Wenn du Probleme hast, zu verstehen, dass ein Atribut einer Klasse (in diesem Fall die Liste mit Bestellpositionen) zu einer Klasse gehört (in diesem Fall die Bestellung), dann solltest du die Aufgabe evtl. beiseite legen und dir das eine oder andere Java Buch durchlesen.
 

rave1989

Mitglied
also für ein ganzes Buch gibt es keine Zeit mehr... da das Projekt neben den zahlreichen anderen Klausuren bald abzugeben ist. Also um den Rest nicht all zu sehr zu vernachlässigen müsste ich bald fertig werden. Aber das meiste habe ich schon, fehlt theoretisch nur noch die Umsetzung des Bestellvorgangs und dann Optimierung.

Ich habe es allerdings tatsächlich nicht gewusst das die Arraylist ein Atribut einer klasse ist, das macht natürlich einiges anschaulicher.
 

rave1989

Mitglied
Leute, sorry aber ich checks einfach nicht.

ich hab gestern die halbe nacht rumprobiert und hab mich nur noch mehr verwirrt. Es ist überhautp nichts brauchbares bei rausgekommen.

Bitte erklärt mir das nochmal schritt für schritt.

Brauche ich zwei klassen?
Falls ja, in die Klasse der Bestellung kommt die Arrayliste rein! Muss diese dann an einem bestimmten Ort stehen, unter einer Methode etc.?
welche befehle müssen wo stehen?

Java:
import java.util.ArrayList;

/**
 *
 * @author 
 */
public class Bestellung {
    private ArrayList<Bestellung> bestellListe;
    private static int idCounter = 3000;
    public int id;
    public String artikel;
    public int anzahl;
    public String uhrzeit;
    public int kundenId;
    
    public Bestellung(){
    bestellListe = new ArrayList<Bestellung>(); 
    }
    
    public Bestellung(String uhrzeit, int kundenId) {
        this.artikel = artikel;
        this.anzahl = anzahl;
        this.uhrzeit = uhrzeit;
        this.kundenId = kundenId;
        this.id = idCounter;
        idCounter++;
        
    }

    /**
     * @return the id
     */

    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the artikel
     */
    public String getArtikel() {
        return artikel;
    }

    /**
     * @param artikel the artikel to set
     */
    public void setArtikel(String artikel) {
        this.artikel = artikel;
    }

    /**
     * @return the anzahl
     */
    public int getAnzahl() {
        return anzahl;
    }

    /**
     * @param anzahl the anzahl to set
     */
    public void setAnzahl(int anzahl) {
        this.anzahl = anzahl;
    }

    /**
     * @return the uhrzeit
     */
    public String getUhrzeit() {
        return uhrzeit;
    }

    /**
     * @param uhrzeit the uhrzeit to set
     */
    public void setUhrzeit(String uhrzeit) {
        this.uhrzeit = uhrzeit;
    }
}

das ist das was ich habe. Gestern habe ich dann in einem anderen Projekt rumprobiert, da dort aber nichts sinnvolles raus gekommen ist, poste ich diesen Quellcode. Hier sind paar Parameter und Methoden drin die nicht verwendet werden, da ich am anfang hier Rumexperementiert habe. Ich muss es dann später nochmal überarbeiten.

Java:
public class Bestellposition extends Bestellung {

    public Bestellposition(int artikelId, int anzahl, int kundenId) {

    }
}


Verwaltungsklasse, in der die Bestellaufnahme erfolgen soll, hier ebenfalls viel rumexperementiert...

Java:
 private void bestellAufnahme() {
        //Bestellzuteilung dem Kunden
        //Erst wird die Kundenliste angezeigt aus der dann der kunde nach Aufforderung per ID herausgesucht wird.
        showKundenListe();
        boolean eingabekontrolle = false;
        int kundenId;
        //Kontrollstruktur für das vorhandensein des kunden und ID eingabeaufforderung
        do{
        int kId = Stdin.readlnInt("Bitte geben Sie die ID des Kunden ein:");
        sucheKundeNachId(kId);
        Iterator<Kunde> iter = kundenListe.iterator();
        while (iter.hasNext()) {
            Kunde i = iter.next();
            if (i.getId() == kId) {
                eingabekontrolle = true;
            }}kundenId = kId;
        }while(!eingabekontrolle);
        
        
        
        boolean mehr = false;

        do {
            showArtikelListe();
            boolean ek2 = false;//ek2 eingabekontrolle2
            int artikelId2;//zum austriksen der gemeinen while schleife
            do {
                int artikelId = Stdin.readlnInt("Bitte geben Sie die ID des gewünschten Artikels an:");
                sucheArtikelNachId(artikelId);

                Iterator<Artikel> iter = artikelListe.iterator();
                while (iter.hasNext()) {
                    Artikel i = iter.next();
                    if (i.getId() == artikelId) {
                        ek2 = true;

                    }
                }
                artikelId2 = artikelId;
            } while (!ek2);
            int anzahl = Stdin.readlnInt("Bitte geben Sie die Anzahl ein:");


            Bestellposition bp1 = new Bestellposition(artikelId2, anzahl, kundenId);
            Bestellung b1 = new Bestellung();
            bestellListe.add(bp1);
            showBestellListe();
            String s = Stdin.readlnString("Weiteren Artikel bestellen?: [y]es [n]o");
            if (s.equals("y")) {
                mehr = false;
            }else {mehr =true;}
        } while (!mehr);
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Java:
public class Bestellung {
    private ArrayList<Bestellung> bestellListe;
public String artikel;
Warum hat deine Bestellung eine Liste von Bestellungen? Und einen Artikel?
 

rave1989

Mitglied
weil wie oben geschrieben ich rumexperementiert habe, und ich am anfang noch artikel in die Bestellung eingegeben habe. Später habe ich den konstruktor dann umgeändert und eine neue klasse bestellposition gegründet, diese nimmt nun die artikel auf.


In die liste von bestellungen habe ich vor später alle bestellungen zu hinterlegen, damit ich diese auf einmal aufrufen kann.
 

Michael...

Top Contributor
Einfach mal überlegen aus welchen Elementen eine Bestellung besteht:
- Eine Bestellung hat ein Datum, eine KundenID und eine Liste mit Bestellpositionen
- Eine Bestellposition enthält einen Artikel und die Anzahl
- Ein Artikel hat eine Bestellnummer, eine Bezeichnung...
Letzteres scheint hier ja nicht zu benötigen und es genügt hier evtl. ein einfacher String.
Die ersten beiden musst Du einfach als Klasse nachbilden.

Und eine Bestellposition erbt sicher nicht von Bestellung. Das sind ja zwei paar Stiefel.
 

rave1989

Mitglied
Michael ich verstehe das alles, aber ich verstehe nicht wo ich im quellcode was hinschreiben soll.

Voraussichtlich möchte ich ja aus der verwaltung heraus neue bestellungen erzeugen. Dort kann ich dann aber keine Bestellpositionen in die Liste der Bestellung ablegen.

wie muss ich den Code der Bestellaufnahme abändern damit das funktioniert?

irgendwas in der richtung vielleicht?

Java:
            Bestellposition bp1 = new Bestellposition(artikelId2, anzahl, kundenId);
            Bestellung b1 = new Bestellung();

            b1.bestellPosListe.add(bp1);
            System.out.println(b1.bestellPosListe);

also das geht auch bis zeile 4 gut, danach gibts einen fehler. Irgendwas stimmt mit der Arrayliste noch nicht...
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
b1.bestellPosListe.add(bp1);

ja grundsätzlich schon. aber konkret ist es eher unsauber, die liste public zu haben. mach einfach eine methode die die Position einfügt..

Java:
import java.util.Date;

public class BestellVerwalltung {

    public static void main(String[] args) {
        Bestellung bestellung = new Bestellung(1, new Date());
        bestellung.setKunde("Ich");

        bestellung.addBestellPostion(new BestellPosition("Bier", 3));
        bestellung.addBestellPostion(new BestellPosition("Wein", 3));
        bestellung.addBestellPostion(new BestellPosition("Schnaps", 3));

    }

}
Java:
public class BestellPosition {

    private String artikelNummer;
    private int anzahl;

    public BestellPosition(String artikelNummer, int anzahl) {
        super();
        this.artikelNummer = artikelNummer;
        this.anzahl = anzahl;
    }

    public String getArtikelNummer() {
        return artikelNummer;
    }

    public void setArtikelNummer(String artikelNummer) {
        this.artikelNummer = artikelNummer;
    }

    public int getAnzahl() {
        return anzahl;
    }

    public void setAnzahl(int anzahl) {
        this.anzahl = anzahl;
    }

}
Java:
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class Bestellung {
    
    private int id;
    private Date date;
    
    private String kunde;
    
    private List<BestellPosition> positionen = new ArrayList<BestellPosition>();

    public Bestellung(int id, Date date) {
        super();
        this.id = id;
        this.date = date;
    }
    
    public void addBestellPostion(BestellPosition postion){
        positionen.add(postion);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getKunde() {
        return kunde;
    }

    public void setKunde(String kunde) {
        this.kunde = kunde;
    }

    public List<BestellPosition> getPositionen() {
        return positionen;
    }
    
}
 

rave1989

Mitglied
Danke Michael, ich glaube langsam verstehe ich was ich alles falsch gemacht habe bis jetzt.

Aber vorab, wozu das super();
und der import List? warum wird da nicht die ArrayListe verwendet sondern die einfache List?
 

rave1989

Mitglied
sorry in dem Post oben sprach ich natürlich zu "ARadauer" :oops:

kann man hier seine eigenen Beiträge nur innerhalb bestimmter zeit editieren...
edit: der Zitat hat sich erledigt vorausgesetzt (siehe unten 1)
So nun wieder ran ans programmieren. Also Ich hab das alles so umgesetzt wie oben von ARadauer erklärt. Ich werde aber das gefühl nicht los das der mir jeweils nur eine Position erstellt.

Java:
            Bestellung b1 = new Bestellung(kundenId, new Date());

            b1.addBestellPostion(new BestellPosition(artikelId2, anzahl));

            System.out.println(b1.positionen.size());

also am ende, in der verwaltungsklasse bei der bestellaufnahme siehts dann wie hier oben gezeigt aus.
das fürht dann aber zu der ausgabe
Code:
Bitte geben Sie die ID des gewünschten Artikels an: 2000
Bitte geben Sie die Anzahl ein: 4
1
Weiteren Artikel bestellen?: [y]es [n]o

wenn ich das ganze paarmal wiederhole, bleibt die größe der liste immernoch 1, aber die müsste doch mit jeder Bestellposition wachsen?

wenn ich folgendes anfrage
Java:
System.out.println(b1.getPositionen());
lautet die antwort
Code:
[PizzaService.BestellPosition@c596a7a]

ist das die Speicheradresse der Bestellposition die er mir raus gibt? Wie bekomme ich denn die Bestellposition an sich heraus?

(1)...vorausgesetzt: das ist wirklich die Speicheradresse! Diese ädert sich nämlich bei jeder position, es werden also ganz viele erstellt. :applaus: hurra! Aber wie bekomme ich diese nun heraus?
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
Wie bekomme ich denn die Bestellposition an sich heraus?
was ist die Bestellposition? Die besteht ja aus mehreren Attributen, was soll Java machen wenn du die Klasse ausgibst? Es gibt den hashcode in hex aus
Du kannst hier einfach die Attribute ausgeben, bzw die toString Methode Bestellposition überschreiben.
 

rave1989

Mitglied
ich versteh das wieder nicht ganz.

Also eine BestellPosition ist ja ein objekt. Wenn ich die Atribute des Objekts aufrufen will, kann ich das über die punktnotation machen. Aber dazu brauche ich ja den Namen des objekts. Die sind aber bei mir sozusagen namenlos!?

Ich nehme an mit der toString Methode könnte ich der BestellPosition einen Namen geben? Aber ich weiss nicht wie das geht...
 

ARadauer

Top Contributor
ok... egal. du willst die positionen ausgeben? dann mach das doch

Java:
for(BestellPosition pos : b1.getPositionen()){
System.out.println(pos.getArtikelNummer());
}
 

rave1989

Mitglied
Also er gibt mir dann immer jeweils die letzte Position heraus.


Wichtig wäre es halt zu verstehen wie ich zu jedem beliebigem Zeitpunkt jede beliebige Position wieder aufgreifen kann.

Das ist wichtig wenn ich z.B. am Schluss eine Rechnung erstellen will.

Diese solll dann so aussehen

Code:
Bestellung mit der KundenID 1000, in auftrag gegeben am...
 hat die BestPos mit der Id 2000 anzahl 3,
hat die BestPos mit der Id 2011 anzahl2,
soll ausgeliefert am...
 

rave1989

Mitglied
Ja bis auf paar kleine Veränderungen nutze ich den code:

Java:
import java.util.*;
import java.util.Date;
import java.util.List;
 
 
public class Bestellung {
    
    private List<BestellPosition> positionen = new ArrayList<BestellPosition>();
    private static int idCounter = 3000;
    private int id;
    private Date date;
    private int kundenId;
    
    
    public Bestellung(){
  }
    
    public Bestellung(int kundenId, Date date) {
    
        this.date = date;
        this.kundenId = kundenId;
        this.id = idCounter;
        idCounter++;
        
    }
 
    
    public void addBestellPosition(BestellPosition position){
        positionen.add(position);
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public Date getDate() {
        return date;
    }
 
    public void setDate(Date date) {
        this.date = date;
    }
 
    public int getKundenId() {
        return kundenId;
    }
 
    public void setKundenId(int kundenId) {
        this.kundenId = kundenId;
    }

    public List<BestellPosition> getPositionen() {
        return positionen;



    }


}
 

rave1989

Mitglied
in meiner Hauptklasse Verwaltung über eine Methode der Verwaltung bestellAufnahme() der untere block
Java:
private void bestellAufnahme() {
        //Bestellzuteilung dem Kunden
        //Erst wird die Kundenliste angezeigt aus der dann der kunde nach Aufforderung per ID herausgesucht wird.
        showKundenListe();
        boolean eingabekontrolle = false;
        int kundenId;
        //Kontrollstruktur für das vorhandensein des kunden und ID eingabeaufforderung
        do {
            int kId = Stdin.readlnInt("Bitte geben Sie die ID des Kunden ein:");
            sucheKundeNachId(kId);
            Iterator<Kunde> iter = kundenListe.iterator();
            while (iter.hasNext()) {
                Kunde i = iter.next();
                if (i.getId() == kId) {
                    eingabekontrolle = true;
                }
            }
            kundenId = kId;
        } while (!eingabekontrolle);



        boolean mehr = false;

        do {
            showArtikelListe();
            boolean ek2 = false;//ek2 eingabekontrolle2
            int artikelId2;//zum austriksen der gemeinen while schleife
            do {
                int artikelId = Stdin.readlnInt("Bitte geben Sie die ID des gewünschten Artikels an:");
                sucheArtikelNachId(artikelId);

                Iterator<Artikel> iter = artikelListe.iterator();
                while (iter.hasNext()) {
                    Artikel i = iter.next();
                    if (i.getId() == artikelId) {
                        ek2 = true;

                    }
                }
                artikelId2 = artikelId;
            } while (!ek2);
            int anzahl = Stdin.readlnInt("Bitte geben Sie die Anzahl ein:");



            Bestellung b1 = new Bestellung(kundenId, new Date());
            bestellListe.add(b1);
            b1.addBestellPosition(new BestellPosition(artikelId2, anzahl));
            
            System.out.println(b1.getDate());
            System.out.println(b1.getPositionen());
            for(BestellPosition pos : b1.getPositionen()){
            System.out.println(pos.getArtikelId());
}
            String s = Stdin.readlnString("Weiteren Artikel bestellen?: [y]es [n]o");
            if (s.equals("y")) {
                mehr = false;
            } else {
                mehr = true;
            }
        } while (!mehr);
}


und fürs erste möchte ich über diese Methode der Hauptklasse die Bestellungen danach anzeigen können
Java:
 private void showBestellListe() {
        String s;

        printZentriert("Bestell-Id");
        printZentriert("Kunden-Id");
        printZentriert("Artikel-ID");
        printZentriert("Anzahl");
        
        printLF();
        printLinieLF(4); // Trennlinie für 6 Felder anzeigen

        Iterator<Bestellung> iter = bestellListe.iterator();
        while (iter.hasNext()) {
            Bestellung i = iter.next();

            s = castInt2String(i.getId());
            printZentriert(s);
            s= castInt2String(i.getKundenId());


          

            
            printLF();
        }
        printLF();
    }
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Du legst in der Schleife ja bei jedem Durchlauf eine neue Bestellung an, daher kann es ja nie mehr als eine Position pro Bestellung geben. Die Bestellung muss natürlich ausserhalb der Schleife erzeugt werden.
 

rave1989

Mitglied
ahhh es funktioniert. Gut das erklärt natürlich einiges.

Das war ja ein echt blöder Fehler. Aber jetzt erstellt der mir eine Bestellung mit mehreren Positionen.

Vielen Dank Leute, ohne euch wär ich aufgeschmissen.

okay jetzt weiter rumprobieren :-D


Leute ich habe noch ein hoffentlich letztes Problem mit den Positionen.
Also auf diese weise rufe ich ja alle auf.


Java:
for(BestellPosition pos : b1.getPositionen()){
System.out.println(pos.getArtikelNummer());
}

Wie kann ich diese aber einzeln aufrufen. Also erst die erste dann die zweite.

Also ich versuche diese nun beim ausgeben der BestellListe anzuzeigen.
gewollt ist
Code:
  Bestell-Id   |   Kunden-Id    |   Artikel-ID   |     Anzahl     | 
--------------------------------------------------------------------
     3000      |      1000      |      2000      |       1        | 
     3000      |      1000      |      2003      |       2

ausgeben tut er mir das hier
Code:
 Bestell-Id   |   Kunden-Id    |   Artikel-ID   |     Anzahl     | 
--------------------------------------------------------------------
     3000      |      1000      |      2000      |       1        | 
     2003      |       2        | 
     3000      |      1000      |

Weil er nach der Kunden ID alle Positionen auf einmal ausgibt. Dann nochmal Bestell und Kunden ID.
Java:
private void showBestellListe() {
        String s;

        printZentriert("Bestell-Id");
        printZentriert("Kunden-Id");
        printZentriert("Artikel-ID");
        printZentriert("Anzahl");

        printLF();
        printLinieLF(4); // Trennlinie für 4 Felder anzeigen

        Iterator<Bestellung> iter = bestellListe.iterator();
        while (iter.hasNext()) {
            Bestellung i = iter.next();

            s = castInt2String(i.getId());
            printZentriert(s);
            s = castInt2String(i.getKundenId());
            printZentriert(s);

            for (BestellPosition pos : i.getPositionen()) {


                s = castInt2String(pos.getArtikelId());
                printZentriert(s);
                s = castInt2String(pos.getAnzahl());
                printZentriert(s);
                printLF();

            }
// das hier ist unsauber und getrickst, würde aber vermutlich funktionieren wenn er mir nur eine Position ausgeben würde...
            s = castInt2String(i.getId());
            printZentriert(s);
            s = castInt2String(i.getKundenId());
            printZentriert(s);
            printLF();
        }
    }
Also so wie ich das gewohnt bin über den iterator schaff ich es nicht.
 
Zuletzt bearbeitet:

langhaar!

Bekanntes Mitglied
Leute ich habe noch ein hoffentlich letztes Problem mit den Positionen.
Also auf diese weise rufe ich ja alle auf.


Java:
for(BestellPosition pos : b1.getPositionen()){
System.out.println(pos.getArtikelNummer());
}

Wie kann ich diese aber einzeln aufrufen. Also erst die erste dann die zweite.

Die for Schleife macht doch genau das; erst das erste, dann das zweite...

Deine Bestellpositionen sind eine Liste. Somit kannst du alles anwenden, was in der Java Api für Listen spezifiziert ist. U.A. kannst du aus der Liste einen Iterator holen oder auch auf die Listenelemente mit get(i) zugreifen.

Es macht aber logisch keinen Unterschied, ob du die Liste mit einem Iterator oder der oben genannten for Schleife durchläufst.

Du hast ein strukturelles Problem mit der Schachtelung deiner Schleifen.
Die Ausgabe der Bestellnr. gehört in die innere Schleife.
 

rave1989

Mitglied
hast recht war nur ein strukturelles wenn mans mit der for schleife macht.

Über den Iterator aber ging es nicht weil unzählige andere probleme vorhanden waren.
Und das hat mich dann zunehmend verwirrt.

Hab es jetzt gelöst es funktioniert! :toll:
 

rave1989

Mitglied
Hey Leute, das Projekt geht voran, dank eurer Hilfe! *TOP*:toll:

Leider bin ich wieder an einer Stelle hängen geblieben und hoffe sehr auf eure Hilfe!

Mittlerweile sieht mein Bestellvorgang gekürzt so aus:
Code:
Bitte geben Sie die ID des gewünschten Artikels an(abbruch mit [0]): 2011
Bitte geben Sie die Anzahl ein: 2

Aktuelle Bestellung des Kunden: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       3        |        8,97    | 
     2011      |       2        |        1,98    | 
Weiteren Artikel bestellen?: [y]es [n]o

Was noch fehlt ist die Einführung eines Mindestbestellwertes. Dieser soll anhand der Postleitzahl des Kunden ermittelt werden.

Als Tipp wurde uns ans Herz gelegt die Enumeration zu benutzen. Und genau hier ist das Problem, mit dem was wir dazu durch genommen haben und mit eigenen Recherchen im Internet komme ich nicht weiter. Ich verstehe die Funktionsweise von Enum nicht ganz.

wir haben ein kleines Beispiel zu Enumeration erhalten, anhand dieses Bsp. habe ich folgendes erstellt:
Java:
public enum Postleitzahl {
//vorerst nur eine Postleitzahl, später eine liste...
    nah("66111", 2,99);
   

    private String postleitzahl;
    private double mindestbestellwert;

  Postleitzahl(String plz, double mbw)
    {
        this.postleitzahl = plz;
        this.mindestbestellwert = mbw;
    }

    /**
     * Methode gibt die Bewertungszahl des Haustyps zurueck.
     * @return bewertungszahl
     */
    public double getMindestbestellwert()
    {
        return this.mindestbestellwert;
    }

    /**
     * Methode gibt die Typbezeichnung des Hauses zurueck.
     * @return typ
     */
    public String getPostleitzahl()
    {
        return this.postleitzahl;
    }
}

Die Idee ist. In der Verwaltungsklasse eine Methode zu gründen die den Mindestbestellwert ermittelt. In etwa so:
Java:
 public double bestimmeMindestbestellwert(int plz) {
        
        String p = castInt2String(plz);
        double mbw = Postleitzahl.valueOf(p));
        return mbw;
    }
Hier ist nun das Hauptproblem, da ich nicht wirklich verstehe wie mit Enum umzugehen ist, hab ich den schrott da oben hingeschrieben. In Wirklichkeit ist oben gewollt, dass er mir anhand des Parameters "int plz" aus meinem Enum Postleitzahl den Mindestbestellwert herausgibt. (Bsp. plz 66111 = mbw 2,99)

Später dann möchte ich bei der bestellaufnahme die Methode einfügen und irgendwann folgendes erreichen:

Code:
Aktuelle Bestellung des Kunden: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       3        |             8,97    | 
     2011      |       2        |             1,98    | 
Mindestbestellwert: 2,99   | Summe:  10,95 |
Mbw erreicht, Bestellung freigegeben.

Es hackt aber ansich nur am Enum, den rest werde ich natürlich(naja hoffentlich:oops:) selbst hinbekommen.

Also was sollte ich wie anders im Enum Postleitzahl schreiben, damit ich mein Vorhaben umsetzen kann?
+Wie hole ich danach aus diesem die mir wichtige Info raus.

Für heute Nacht bin ich leider nicht mehr zu Mehr fähig als dass da oben,
Vielen Dank für eure Mühe und Verständnis mit mir!
 

ARadauer

Top Contributor
Den Tipp zur Abbildung von Postleitzahlen ein Enum zu verwenden verstehe ich nicht ganz. Macht für mich keinen Sinn. Ein Enum ist eine Aufzählung.
Für zb einen Status oder sowas in die Richtung.
 

langhaar!

Bekanntes Mitglied
Was noch fehlt ist die Einführung eines Mindestbestellwertes. Dieser soll anhand der Postleitzahl des Kunden ermittelt werden.

Als Tipp wurde uns ans Herz gelegt die Enumeration zu benutzen.

Vermutlich hast du da etwas ein wenig durcheinandergebracht.
PLZ-Nummern über Enums aufzuzählen macht - wie bereits von meinen Vorpostern erwähnt - keinen Sinn.

Ich vermute, es gibt eine Gurppe von Mindestbestellwerten, die du aufzählen sollst und dann den PLZ zuweist.

Beispiel:

MBW1 = 10 Euro
MBW2 = 20 Euro
MBW3 = 50 Euro

Die Zuweisung selbst würde dann z.B. über eine Map funktionieren, so dass man jeder PLZ einen Bestellwert zuweisen kann oder evtl. sogar nach Nummernkreisen. Beispiel:

Wenn PLZ zwischen 50000 und 59999 dann nutze MBW1
Wenn PLZ zwischen 100000 und 49999 dann nutze MBW2
Ansonsten nimm MBW3

Das hängt von dem genauen Wortlaut bzw. der Interpretation der Aufgabe ab.
 

rave1989

Mitglied
Also eine "Map" sagt mir nichts, haben wir nicht durchgenommen!

Der genaue Wortlaut in der Aufgabenstellung lautet:
Aufzahlungsklasse (Enum-Klasse)
Fur Postleitzahlen der Orte und Mindestbestellwerte

Wie genau wir das umsetzen sollen wird eben nicht erwähnt. Es gibt nur ein bespiel zum Enum, in einem komplett anderem Zusammenhang.

die Idee von langhaar finde ich ganz gut, so war in etwa auch mein Ansatz. Deswegen steht auch bei mir oben "nah(66111, 2.99)" später wollte ich noch "weit", "sehrweit" einfügen. bzw MBW 1, 2 ,3...
 
M

Marcinek

Gast
Hallo,

obwohl man dafür niemals Enumarationen nehmen würde, weil diese eigentlich fest sind, könnte man das dennoch so machen.

1. Enumaration genau so wie du sie oben gemacht hast,

2. Die Bestellung hat ein Feld PLZ.

Dann kannst du machen PLZ.getMBW().

Die Verwaltungsklasse soll nix über PLZs wissen sollen
 

rave1989

Mitglied
Naja ich nehme an wir sollen irgendwie ein Enum verwenden und da das mit der Postleitzahl am passendsten ist als alles andere sollen wir es eben so machen, ansonsten kann ich es mir auch nicht erklären.

"2. Die Bestellung hat ein Feld PLZ." was genau meinst du damit?

ich verstehe gerade nicht wie ich PLZ mit Punktnotation ansprechen kann, instanzieren darf ichs nicht, anders gibt er mir die Methoden nicht her...
 

Kiri

Bekanntes Mitglied
Naja ich nehme an wir sollen irgendwie ein Enum verwenden und da das mit der Postleitzahl am passendsten ist als alles andere sollen wir es eben so machen, ansonsten kann ich es mir auch nicht erklären.

"2. Die Bestellung hat ein Feld PLZ." was genau meinst du damit?

ich verstehe gerade nicht wie ich PLZ mit Punktnotation ansprechen kann, instanzieren darf ichs nicht, anders gibt er mir die Methoden nicht her...

Dann ließ dir mal folgendes durch (Stichwort "static"): static Punktnotation
 

rave1989

Mitglied
Nein ich habe leider kein Java Buch, ist aber auch nicht unbedingt notwendig, steht doch alles im Internet, man muss es nur noch verstehen und anwenden können.

Ok also die klassische Punktnotation ist bei Enum etwas anders habe ich jetzt kapiert.

Meine Methode um den MBW herauszubekommen habe ich folgend umgestaltet:

Java:
 public void bestimmeMindestbestellwert() {
        
        Postleitzahl p = Postleitzahl.p66111;

        int mbw = p.getMindestbestellwert();
           System.out.println( "ich bin mbw"+ mbw);

Das ist jetzt rein provisorisch und Spiegelt keineswegs die angestrebte Methode. Das wunderbare daran ist, es funktioniert, erklärt mir so ein bisschen die Punktnotation beim Enum und das war es dann auch.

Wie ich anhand einer vorgegebenen Postleitzahl die bevorzugterweise an die obere Methode übergeben werden soll, meinen MBW herausbekomme ist mir leider immernoch nicht klar.

Ich müsste ja praktisch einen Vergleich mit dem Enum anstellen. "Wenn Postleitzahl 66111, gib MBW raus!"

...

Hmm gerade :idea: einen Gedankenblitz gehabt:

Was wenn ich meine ca 20 PLZ in 3 Gruppen sortiere. Damit einen vergleich anstelle der mir dann nur noch "nah, fern, sehrweit" rausspukt. Diese drei Gruppen haben einen MBW und den lasse ich mir ausgeben... Ist zwar vermutlich ein Umweg über 7 Berge aber mal ausprobieren...



edit:

also praktisch sowas
Java:
  public int bestimmeMindestbestellwert(int plz) {
        
        int mbw = 0;
        if(plz == 66111){
         Postleitzahl p = Postleitzahl.nah;
        mbw = p.getMindestbestellwert();}
return mbw;}

jetzt nur noch die PLZ in 3 Kategorien einordnen und "else if" Anweisung formulieren.

Frage, wie kann ich die if-Schleife hierbei am schönsten formulieren. Vor allem mit den ca 20 PLZ.
 
Zuletzt bearbeitet:

rave1989

Mitglied
ok so sieht das Ergebnis aus:


Code:
AKTUELLE BESTELLUNT DES KUNDEN: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       2        |        5,98    | 
----------------------------SUMME:       5,98    | 
---------------MINDESTBESTELLWERT:      5        | 
Bestellstatus: FREIGEGEBEN

über diesen Umweg:

Java:
public int bestimmeMindestbestellwert(int plz) {

        int mbw = 0;

        if (plz == 66111 || plz == 66113 || plz == 66115 || plz == 66117 || plz == 66119|| plz == 66121) {
            mbw = Postleitzahl.nah.getMindestbestellwert();
        } else if (plz == 66123 || plz == 66125 || plz == 66126 || plz == 66127 || plz == 66128) {
            mbw = Postleitzahl.fern.getMindestbestellwert();

        } else {
            mbw = 12;
        }
        return mbw;
    }

Also für Verbesserungsvorschläge immer offen! ;-)
 
M

Marcinek

Gast
Verstehe ich nicht.

Oben hast du zwei richtige Gedanken, und dann kommt da sowas bei raus???

Java:
public enum Postleitzahl {

	D45329(6), D45689(7);
	
	private int mbw;

	private Postleitzahl (int mindestbestellwert) {
		this.setMbw(mindestbestellwert);
	}

	public int getMbw() {
		return mbw;
	}

	private void setMbw(int mbw) {
		this.mbw = mbw;
	}
	
	
}
und dann
Java:
public class Bestellung {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Postleitzahl valueOf = Postleitzahl.valueOf("D45329");

		valueOf.getMbw();
	}

}

Die PLZ muss an die Bestellung dran.
 

rave1989

Mitglied
naja ganz einfach:

das hier passt nicht ganz bzw. weiß nicht wie ich damit richtig umgehen soll.
Java:
public class Bestellung {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Postleitzahl valueOf = Postleitzahl.valueOf("D45329");
 
        valueOf.getMbw();
    }
 
}

Mein Ablauf sieht es ja vor dass ich hier:
Java:
Iterator<Kunde> iter = kundenListe.iterator();
        while (iter.hasNext()) {
            Kunde i = iter.next();
            if (i.getId() == kundenId) {
               plz = i.getPostleitzhal();
            }}

die PLZ bekommme und diese dann weiterverarbeiten will. Und jetzt weiß ich nicht wie ich damit weiter arbeiten soll, das war ja von anfang an das problem.

ich kann ja nicht folgendes verwenden
Java:
 public static void main(String[] args) {
        Postleitzahl valueOf = Postleitzahl.valueOf(plz);
 
        valueOf.getMbw();

(plz ist meine plz von oben als int) In deinem fall müsste ich dann alle Postleitzahlen mit einem Buchstaben versehen. Was ja auch eine Umwandlung zu einem String erfordern würde, die Umwandlung an sich ist ja kein Problem, aber zu meinem int müsste ich ja noch einen Buchstaben anhängen. Bzw die hälfte umschreiben und überall aus int PLZ einen String p66111 machen. Und das sind einfach zu viele Sachen die mein wissen Überseiten bzw. den Arbeitsaufwand in die höhe treiben...
 
Zuletzt bearbeitet:

Neue Themen


Oben