# Vorgehensweise unklar



## Pixi (5. Mrz 2018)

Hallo liebe Java-Forum Gemeinde!
ich bin neu hier und hoffe, dass ich im richtigen Unterforum schreibe und mich an die ForumRegeln halte. 

Ich wollte aus Übungszwecken ein kleines eigenes Programm schreiben, allerdings ist mir unklar wie ich am besten vorgehen sollte und komme selber nicht weiter. Ich schildere kurz wie das Programm ausschauen soll.

Es geht bei dem Programm darum einen Grillabend zu organisieren und zu berechnen wie viel jeder Gast an Geld zahlen muss, je nachdem was er alles konsumiert (Vegetarier sollen sich zB nicht am Fleisch beteiligen, Autofahrer nicht am Alkohol usw). Man soll verschiedene Kategorien einfügen können wie zB "Fleisch", "Gemüse", "Alkohol", "alkoholfreie Getränke" usw. Und jeder einzelne Kategorie soll man Kosten zuordnen. (zB Das Fleisch hat 35 Euro gekostet, das Gemüse 10Euro usw).
Man soll Gäste einfügen können und für jeden Gast individuell auswählen, bei welchen Kategorien er sich beteiligt. 
Allerdings will ich nicht dass man von vornherein festlegen muss wie viele verschiedene Kategorien es gibt bzw wie viele Gäste genau kommen, sondern dynamisch einen neuen Gast, eine neue Kategorie hinzufügen können. Auch die Reihenfolge scheint mir egal zu sein (weshalb ich Array als Lösung auschließe)
Am Ende soll man für jeden individuellen Gast berechnen können, was er zu zahlen hat. Jemand der sich an Fleisch und Gemüse beteiligt, hat quasi folgende Kosten= "Fleischkosten"/"Menge aller Gäste die sich am Fleisch beteiligen" + "Gemüsekosten"/"Menge aller Gäste die sich am Gemüse beteiligen" ...

Ich hoffe ich konnte etwa erklären, was ich vorhabe. 

Datenstrukturen wie Stapel, Listen, verkettete Listen usw sind mir bekannt, auch mit Klassen und Objekten kenne ich mich auch. Mit Datenbanken allerdings noch *nicht *und ich weiß eben nicht ob ich für dieses Programm Datenbanken bräuchte oder nicht. 

Mein Problem ist folgendes: 
Ich kann eine Klasse Kategorie schreiben, sd ich verschiedene Objekte der Klasse Kategorie erstellen kann, die verschiedene Kosten haben und verschieden heißen.
Ich kann auch eine Klasse Gäste schreiben, sd ich verschiedene Objekte der Klasse Gäste erstellen kann, die verschieden heißen.
Aber wie kann ich *(1.)* einem Gast x verschiedene Kategorien zuordnen und* (2.) *gleichzeitig für jede Kategorie zählen, wie viele Gäste sich an dieser Kategorie beteiligen?

Der Lange Text tut mir leid, und ich hoffe ich habe einigermaßen verständlich erklärt, wieso ich nicht weiterkomme. 

Viele Grüße und Danke schonmal fürs Lesen!!!


----------



## mrBrown (5. Mrz 2018)

Pixi hat gesagt.:


> Mit Datenbanken allerdings noch *nicht *und ich weiß eben nicht ob ich für dieses Programm Datenbanken bräuchte oder nicht.


Brauchst du nicht, solche Dinge kann man immer auch ohne Datenbank lösen 



Pixi hat gesagt.:


> Ich kann eine Klasse Kategorie schreiben, sd ich verschiedene Objekte der Klasse Kategorie erstellen kann, die verschiedene Kosten haben und verschieden heißen.
> Ich kann auch eine Klasse Gäste schreiben, sd ich verschiedene Objekte der Klasse Gäste erstellen kann, die verschieden heißen.
> Aber wie kann ich *(1.)* einem Gast x verschiedene Kategorien zuordnen und* (2.) *gleichzeitig für jede Kategorie zählen, wie viele Gäste sich an dieser Kategorie beteiligen?


Kategorien bekommen einfach eine Liste/Set/Whatever von Gästen, sodass du der Kategorie dann Gäste hinzufügen kannst


----------



## Javinner (5. Mrz 2018)

Pixi hat gesagt.:
			
		

> Aber wie kann ich *(1.)* einem Gast x verschiedene Kategorien zuordnen und* (2.) *gleichzeitig für jede Kategorie zählen, wie viele Gäste sich an dieser Kategorie beteiligen?


Gast hat: Namen, Vegetarier (Ja/Nein), Trinker(Ja/Nein)
Was weiß man bei Partybeginn? Die Anzahl der Geste und die Einkaufsliste samt Preisen.
Ich an deiner Stelle würde die Einkaufsliste durchgehen und anhand der Gasteigenschaften für jeweiligen Gast 
die Rechnung ausstellen.


----------



## Javinner (6. Mrz 2018)

Pixi hat gesagt.:
			
		

> Allerdings will ich nicht dass man von vornherein festlegen muss wie viele verschiedene Kategorien es gibt bzw wie viele Gäste genau kommen, sondern dynamisch einen neuen Gast, eine neue Kategorie hinzufügen können


Ein neuen Gast hinzufügen ist wohl kein Problem, eine neue Kategorie? Das ist mit viel Arbeit verbunden, denn 
irgendwo muss diese neue Kategorie bereits erwähnt sein, damit es einer Hauptkategorie beim Abrechnen zugeordnet werden kann. 



> weshalb ich Array als Lösung auschließe


Ob es hilfreich ist? Schließlich benutzt ArrayList intern ebenso ein Array.. Ich würde die Entscheidung nochmals überdenken  

Eine Datenbank wird hier, wie @mrBrown  bereist erwähnt hat, nicht nötig sein. Du willst ja letztendlich nur den Grillabend berechnen. Eine mögliche Lösung könnte so aussehen:

```
public class Barbecue
{

    public static void main(String[] args)
    {
        BarbecueRegister personList = new BarbecueRegister();
        personList.addToParty(new Person("Natalie", false, false));
        personList.addToParty(new Person("Tanja", true, true));
        personList.addToParty(new Person("Otto", false, true));
        personList.addToParty(new Person("Oliver", true, false));
        personList.getPartyGuestsInfo();

        ProductRegister productRegister = new ProductRegister();
        productRegister.addToShoppingList(new Product(Paraphernalia.EDIBLE_MEAT, 40));
        productRegister.addToShoppingList(new Product(Paraphernalia.EDIBLE_GENERAL, 25));
        productRegister.addToShoppingList(new Product(Paraphernalia.DRINKABLE_ALCOHOL, 40));
        productRegister.addToShoppingList(new Product(Paraphernalia.DRINKABLE_GENERAL, 15));

        System.out.println("----------------------------------");
       
        CashRegister cashRegister = new CashRegister();
        cashRegister.getProportionallyCost(personList, productRegister);

    }
}
/** Konsolenausgabe */
Name: Natalie, Fleisch: Nein, Alkohol: Nein
Name: Tanja, Fleisch: Ja, Alkohol: Ja
Name: Otto, Fleisch: Nein, Alkohol: Ja
Name: Oliver, Fleisch: Ja, Alkohol: Nein
----------------------------------
Name: Natalie, Gesamtkosten: 10.0
Name: Tanja, Gesamtkosten: 50.0
Name: Otto, Gesamtkosten: 30.0
Name: Oliver, Gesamtkosten: 30.0
```


----------



## mrBrown (6. Mrz 2018)

Javinner hat gesagt.:


> Ein neuen Gast hinzufügen ist wohl kein Problem, eine neue Kategorie? Das ist mit viel Arbeit verbunden, denn
> irgendwo muss diese neue Kategorie bereits erwähnt sein, damit es einer Hauptkategorie beim Abrechnen zugeordnet werden kann.


Eine neue Kategorie erstellen ist Genaus viel Arbeit wie ein neuer Gast (zumindest mit der von mir Erwähnten Lösungsvariante) 



Javinner hat gesagt.:


> Ob es hilfreich ist? Schließlich benutzt ArrayList intern ebenso ein Array.. Ich würde die Entscheidung nochmals überdenken


Die Aussage ist genauso sinnvoll, wie keine Maschinensprache benutzen zu wollen, obwohl Java in diese kompiliert wird


----------



## Pixi (7. Mrz 2018)

@mrBrown und @Javinner vielen vielen Dank für die schnellen Antworten)



mrBrown hat gesagt.:


> Brauchst du nicht, solche Dinge kann man immer auch ohne Datenbank lösen



ok super, das ist schonmal gut



mrBrown hat gesagt.:


> Kategorien bekommen einfach eine Liste/Set/Whatever von Gästen, sodass du der Kategorie dann Gäste hinzufügen kannst



hm irgendwie ist mir das noch nicht ganz klar. Ich habe zB 3 verschiedene Kategorie Objekte und 4 verschiedene Gäste Objekte. Wenn ich jetzt eine Methode schreibe, welche den Kategorien Gäste hinzufügt(zb. Fleisch.add("Heike")), dann "weiß" das Fleisch natürlich, dass sich eine weitere Person beteiligt, welche Heike heißt. Aber wie kann ich verdeutlichen, dass es sich um das bereits existierende Objekt "Heike" handelt? Sodass es zB möglich wäre alle Kategorien aufzurufen bei denen sich Heike beteiligt?

Ich will quasi eine Liste von Kategorie Objekten und eine Liste von Gäste Objekten haben und denen eine Beziehung hinzufügen. Und vor allem möchte ich problemlos sowohl eine neue Kategorie hinzufügen können als auch einen neuen Gast.




Javinner hat gesagt.:


> Gast hat: Namen, Vegetarier (Ja/Nein), Trinker(Ja/Nein)
> Was weiß man bei Partybeginn? Die Anzahl der Geste und die Einkaufsliste samt Preisen.
> Ich an deiner Stelle würde die Einkaufsliste durchgehen und anhand der Gasteigenschaften für jeweiligen Gast
> die Rechnung ausstellen.



Ich will eben auch während der Partyplanung einen neuen Gast oder eine neue Kategorie hinzufügen können ohne nochmal alles von vorne "eintippen" zu müssen!




Javinner hat gesagt.:


> Eine mögliche Lösung könnte so aussehen:
> 
> ```
> public class Barbecue
> ...



vielen vielen Dank für Deine Mühe und Hilfe!!!! Allerdings müsste man hier beim Erstellen eines neuen Gastes, eine feste Menge an Kategorien haben.. Mir ist es aber wichtig, flexibel neue Gäste und neue Kategorien erstellen zu können. Ist sowas überhaupt möglich?


Nochmals vielen Dank für Eure Antworten)


----------



## Pixi (7. Mrz 2018)

Es gibt wohl tatsächlich Beziehungen zwischen Klassen http://openbook.rheinwerk-verlag.de/oop/oop_kapitel_04_003.htm
denkt ihr das könnte die Lösung meines Problems sein? Denn dann würde ich mich da einlesen


----------



## Pixi (7. Mrz 2018)

Pixi hat gesagt.:


> Aber wie kann ich verdeutlichen, dass es sich um das bereits existierende Objekt "Heike" handelt?



ok diese Frage war dumm, ich bitte dies zu entschuldigen


----------



## Javinner (7. Mrz 2018)

Pixi hat gesagt.:
			
		

> Ich habe zB 3 verschiedene Kategorie Objekte und 4 verschiedene Gäste Objekte


Es wäre sehr hilfreich, wenn du das, was du bereits hast, hier postest. 


> Aber wie kann ich verdeutlichen, dass es sich um das bereits existierende Objekt "Heike" handelt?


In dem du jeden Gast eine eigene ID verpasst (statische Klassenvariablen). Oder über HashCode, dann wären aber paar Eingaben zu jeweiligem Gast dringend nötig. Hier der beste Artikel, welchen ich zum Thema je las.


> Allerdings müsste man hier beim Erstellen eines neuen Gastes, eine feste Menge an Kategorien haben..


Die Anzahl der Gäste ist variabel und kann problemlos erweitert werden, den schließlich erstellst du ja nur ein neues Objekt der Klasse "Person" und fügst es der Gästeliste zu. Was du unter "Kategorien" vorstellst und wie dann das alles aussehen soll, ist mir im Augenblick nicht richtig klar, aber bereits erwähnt.


----------



## mrBrown (8. Mrz 2018)

Javinner hat gesagt.:


> In dem du jeden Gast eine eigene ID verpasst (statische Klassenvariablen). Oder über HashCode, dann wären aber paar Eingaben zu jeweiligem Gast dringend nötig. Hier der beste Artikel, welchen ich zum Thema je las.


ID und statische Klassenvariablen wiedersprechen sich allerdings...und hashcode hat damit nicht wirklich was zu tun


----------



## Javinner (8. Mrz 2018)

@Pixi
Das mit Kategorien ist mir Heute Nacht eingefallen, oh man 
Habe kurzerhand was geschrieben. Hast du es so gemeint?

```
public class BarbecueTwo
{

    public static void main(String[] args)
    {
        Person alex = new Person("Alex", "Mueller");
        Person lili = new Person("Lili", "Adler");
        Person antje = new Person("Antje", "Wuttig");
        Person marieS = new Person("Marie", "Schmidt");
        Person marieA = new Person("Marie", "Alsbach");

        Category wein = new Category("Wein", 10);
        Category haenchen = new Category("Hänchen", 6);
        Category salat = new Category("Salat", 4);
        Category grillKohle = new Category("Grillkohle", 3);

        wein.addToCategory(alex, lili, antje, marieA);
        haenchen.addToCategory(marieS, antje, marieA);
        salat.addToCategory(lili, antje, marieS);
        grillKohle.addToCategory(alex, lili, antje, marieS, marieA);

        List<Category> list = new ArrayList<>();
        list.add(wein);
        list.add(haenchen);
        list.add(salat);
        list.add(grillKohle);

        CashRegister cashRegister = new CashRegister(list);
        cashRegister.printProportionallyCost();

    }

}
/** Konsolenausgabe */
Antje Wuttig, Rechnung: 6.433
Alex Mueller, Rechnung: 3.1
Marie Alsbach, Rechnung: 5.1
Lili Adler, Rechnung: 4.433
Marie Schmidt, Rechnung: 3.933
```

Nun lassen sich Kategorien sowie Personen beliebig hinzufügen 
(gelöschter Text, war unwichtig)

@mrBrown
Wie ich bereits schrieb: lass deinen Aussagen Taten folgen und untermauere diese mit Code.
Dies würde dem einen oder anderen Thread viel mehr beitragen, als nur klug daher zu schreiben.
Mag sein, dass du uns allen überlegen bist, jedoch trägt deine momentane Vorgehensweise wenig bis nichts dazu bei


----------



## mrBrown (8. Mrz 2018)

Javinner hat gesagt.:


> @mrBrown
> Wie ich bereits schrieb: lass deinen Aussagen Taten folgen und untermauere diese mit Code.
> Dies würde dem einen oder anderen Thread viel mehr beitragen, als nur klug daher zu schreiben.
> Mag sein, dass du uns allen überlegen bist, jedoch trägt deine momentane Vorgehensweise wenig bis nichts dazu bei


Mit fertigem Code ist hier wohl kaum geholfen (und das meiste was ich sage lässt sich kaum sinnvoll mit Code untermauern...)

Ich denke mal das bezieht sich auf die Aussage zu IDs und hashcode? Was soll man da an fertigem Code zeigen, ohne das man alles liefert?  (mit dem gleichem Anspruch hättest du dann dazu auch schon Code zeigen müssen...)
das static und ID sich nicht verträgt sollte doch auch klar sein? eine statische Variable kann eben niemals pro Objekt einzigartig sein...


----------



## Pixi (8. Mrz 2018)

@Javinner und @mrBrown vielen Dank für die weiteren hilfreichen Antworten)

@Javinner , ich glaube du hast nun verstanden wie ich es meine) Also ich will eben nicht am Anfang angeben müssen wie viele Gäste und wie viele Kategorien es sind.

Ich hab mich ein bisschen im Thema n-m Beziehungen eingelesen und nun drei Klassen geschrieben und ich denke dass das der richtige Weg sein könnte/sollte. Leider kriege ich es aber nicht hin eine ganz wichtige Methode zu schreiben. Ich poste allerdings erstmal den Code und erläutere dann was mein Problem ist
Da ich sowas zum ersten Mal programmiert habe, ist jeder Tipp und jegliche Kritik an dem Code herzlich willkommen

```
import java.util.ArrayList;
public class Guest{
   private String name;
   private ArrayList<Categorie> Categories;
  
   public Guest(String name) {
       this.name=name;
       this.Categories=new ArrayList<Categorie>();
   }
  
   public String getName(){
       return this.name;
   }
  
   public void addCategorieReference(Categorie categorie){
       this.Categories.add(categorie);
   }
}


import java.util.ArrayList;
public class Categorie {
   private String name;
   private double cost;
   private ArrayList<Guest> Guests;
  
   public Categorie (String name)
   {
       this.name=name;
       this.cost=0;
       this.Guests=new ArrayList<Guest>();
   }
  
   public void addamount(double amount)
   {
       this.cost+=amount;
   }
  
   public double getcost()
   {
       return this.cost;
   }
  
   public String getname()
   {
       return this.name;
   }
  
   public void addGuestReference(Guest guest)
   {
       this.Guests.add(guest);
   }
  
   public int getAmountOfParticipants()
   {
       return this.Guests.size();
   }
  
}

import java.util.ArrayList;


public class Party {
  
   ArrayList<Categorie> categories;
   ArrayList<Guest> guests;
   String name;  
  
   public Party(String name)
   {
       this.name=name;
       this.categories=new ArrayList<Categorie>();
       this.guests=new ArrayList<Guest>();
  
   }
  
   public void add_guest(Guest guest)
   {
       guests.add(guest);
   }
  
   public void add_categorie(Categorie categorie)
   {
       categories.add(categorie);
   }
  
 /*folgende Methode kriege ich nicht hin. Ich weiß dass ich die addGuestReference und addCategorieReference Methoden hier verwenden müsste, aber ich weiß nicht wie genau ich das tun soll. Wichtig ist, dass wenn ein Gast eine Kategorie zugeteilt bekommt, die Kategorie auch einen Gast zugeteilt bekommt und umgekehrt. Ich hoffe Ihr versteht was ich meine!*/
public void add_relation(Categorie categorie,Guest guest)
  {
  }
   
}
```

Also ich hab eben zwei Klassen (Gäste und Kategorien erstellt), die beide jeweils eine ArrayList der anderen Klasse besitzen. Also "besitzt" jeder Gast eine Liste von Kategorien und jede Kategorie eine Liste von Gästen. Ich habe auch pro Klasse eine Methode geschrieben, welche diesen Listen Elemente hinzufügt.

Das einzige Problem, das ich gerade denke ich noch habe, ist es eine Methode zu schreiben, die eine bestimmte Kategorie und einen bestimmten Gast verbindet. Also der Gast A bekommt in seiner Kategorieniste die Kategorie B, und die Kategorie B bekommt gleichzeitig in seiner GästeListe den Gast A.

Ich hoffe ihr versteht mein Problem und danke für Eure Zeit und Mühe!!
Viele Grüße!


----------



## mrBrown (8. Mrz 2018)

Wie rufst du denn die add_guest-Methode auf?


----------



## Pixi (8. Mrz 2018)

mrBrown hat gesagt.:


> Wie rufst du denn die add_guest-Methode auf?



Ich rufe sie auf eine bestimmte Party auf. zB:

Party silvester=new Party("Silvester");
Guest heike=new Guest("Heike");
silvester.addGuest(Heike);

also in der Klasse Party, habe ich versucht die anderen zwei Klassen zusammenzufügen, aber ich weiß nicht ob das Sinn ergibt..


----------



## Javinner (8. Mrz 2018)

Pixi hat gesagt.:
			
		

> Leider kriege ich es aber nicht hin eine ganz wichtige Methode zu schreiben


Immer dann, wenn du eine Person einer Kategorieliste oder eine Kategorie einer Personliste hinzufügst, solltest du
gleich in der add()-Methode jeweils die Parametervariable dazu auffordern, die Person, bzw. die Kategorie aufzunehmen (this)


----------



## Javinner (8. Mrz 2018)

@Pixi 
Irgendwie komme ich nicht dahinter, wie du es machen willst, bzw. warum du es doppelt einrichten willst.


----------



## Pixi (9. Mrz 2018)

Javinner hat gesagt.:


> @Pixi
> Irgendwie komme ich nicht dahinter, wie du es machen willst, bzw. warum du es doppelt einrichten willst.



verstehe ich es richtig, dass du meinst, dass die klassen Guest und Categorie ausreichen?
(also so?)

```
import java.util.ArrayList;
public class Guest{
   private [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name;
   private ArrayList<Categorie> Categories;
  
   public Guest([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name) {
       this.name=name;
       this.Categories=new ArrayList<Categorie>();
   }
  
   public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName(){
       return this.name;
   }
  
   public void addCategorieReference(Categorie categorie){
       this.Categories.add(categorie);
   }
}


import java.util.ArrayList;
public class Categorie {
   private [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name;
   private double cost;
   private ArrayList<Guest> Guests;
  
   public Categorie ([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name)
   {
       this.name=name;
       this.cost=0;
       this.Guests=new ArrayList<Guest>();
   }
  
   public void addamount(double amount)
   {
       this.cost+=amount;
   }
  
   public double getcost()
   {
       return this.cost;
   }
  
   public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getname()
   {
       return this.name;
   }
  
   public void addGuestReference(Guest guest)
   {
       this.Guests.add(guest);
   }
  
   public int getAmountOfParticipants()
   {
       return this.Guests.size();
   }
  
}
```


----------



## redacted (9. Mrz 2018)

Spoiler



ups kann den beitrag nicht mehr löschen


----------



## Javinner (9. Mrz 2018)

Pixi hat gesagt.:
			
		

> verstehe ich es richtig, dass du meinst, dass die klassen Guest und Categorie ausreichen?


Letztendlich ist es egal, ob das Produkt den Gast hinzufügt (#11) oder umgekehrt.
Wichtig ist die Abrechnung und hier gilt eins: viele Wege führen nach Rom. Welchen Weg du nimmst, liegt ganz allein bei dir. Ich bin hier den Weg gegangen, der Aufforderung nach, alle Gäste den jeweiligen Waren(Kategorien), an den sich diese beteiligen, hinzuzufügen. Danach übergab ich die Liste der Waren(Kategorien), welche a) den Preis und b) eine Liste bestimmter Gäste inne hat, an die Abrechnung. Und genau hier wird es interessant: Hier erschien es mir sinnvoll, fürs Erste alle Gäste in einer Liste aufzunehmen, natürlich unter dem Aspekt, dass ein Gast nur einmal in der Liste vorkommen darf. Danach bin ich die Einkaufsliste durchgegangen und immer dann, wenn ein Gast in der jeweiligen Kategorie auftauchte, dem Gast das jeweilige Anteil in die Rechnung gestellt habe. Am Ende habe ich es in der Konsole ausgeben lassen.

Die Frage, ob hier nur die Klassen notwendig sind, lässt sich nur soweit erklären, dass es hier für den Moment ausreicht, um jedem Gast die anteiligen Kosten jeder Kategorie, an welcher er sich beteiligt, hinzuzufügen, um ihm am Ende eine Rechnung ausstellen zu können. Natürlich lassen sich neue Gäste und Kategorien problemlos erstellen. Der Abrechnung ist es egal.


Spoiler: Kein Grillfest





```
public class BarbecueTwo
{

    public static void main(String[] args)
    {
        Person alex = new Person("Alex", "Mueller");
        Person lili = new Person("Lili", "Adler");
        Person antje = new Person("Antje", "Wuttig");
        Person marieS = new Person("Marie", "Schmidt");
        Person marieA = new Person("Marie", "Alsbach");
        Person markusW = new Person("Markus", "Werner");
        Person arturF = new Person("Artur", "Frank");
   
   

        Category wein = new Category("Wein", 10);

        /*Category haenchen = new Category("Hänchen", 6);
        Category salat = new Category("Salat", 4);
        Category grillKohle = new Category("Grillkohle", 3);
        Category grueneBohnen = new Category("Grüne Bohnen", 1.99);
        Category steak = new Category("Steak", 22);
        Category gefuelltePilze = new Category("Gefüllte Pilze", 7.99);*/

        wein.addToCategory(alex, lili, antje, marieA, marieS, markusW, arturF);

        /*haenchen.addToCategory(marieS, antje, marieA);
        salat.addToCategory(lili, antje, marieS);
        grillKohle.addToCategory(alex, lili, antje, marieS, marieA, markusW, arturF);
        grueneBohnen.addToCategory(antje, marieA, marieS, markusW);
        steak.addToCategory(alex, markusW, arturF, marieA);
        gefuelltePilze.addToCategory(antje, lili, marieA, marieS, markusW);*/

        List<Category> list = new ArrayList<>();
        list.add(wein);

        /*list.add(haenchen);
        list.add(salat);
        list.add(grillKohle);
        list.add(grueneBohnen);
        list.add(steak);
        list.add(gefuelltePilze);*/

        CashRegister cashRegister = new CashRegister(list);
        cashRegister.printProportionallyCost();

    }

}
/** Konsolenausgabe */
Markus Werner, Rechnung: 1.4285714285714286
Antje Wuttig, Rechnung: 1.4285714285714286
Artur Frank, Rechnung: 1.4285714285714286
Alex Mueller, Rechnung: 1.4285714285714286
Marie Alsbach, Rechnung: 1.4285714285714286
Lili Adler, Rechnung: 1.4285714285714286
Marie Schmidt, Rechnung: 1.4285714285714286
```



Ich persönlich sehe hier die doppelten "Beziehungen" (Kategorie kennt ihre Gäste und Gäste kennen alle Kategorien, an den diese sich beteiigen) kein Sinn. Es reicht aus, wenn nur eine "Beziehung" feststeht, damit die Abrechnung die Rechnung auslassen kann.


----------



## Pixi (9. Mrz 2018)

Javinner hat gesagt.:


> viele Wege führen nach Rom.



Hallo Javinner,
erstmal nochmal vielen Dank für deine ganzen Antworten
Du hast Recht, viele Wege führen nach Rom. Aber irgendwie wollte ich unbedingt eine bidirektionale m-n Relation programmieren. Eigentlich wollte ich dieses Programm schreiben um dann zu versuchen meine erste GUI zu schreiben. Und ich hab gedanklich total darauf behart, das Programm ganz genau so zu schreiben, wie ich es mir anfangs vorgestellt hatte

Dein Lösungsvorschlag hätte auf jeden Fall den selben Zweck erfüllt und vielen Dank dafür

Ich habs jetzt auf jeden Fall geschafft die Methode zu schreiben, die genau die Beziehung zwischen zwei Objekten herstellt, die ich auch wollte. Wahrscheinlich habe ich das ganze unnötig kompliziert gemacht, aber wieso leicht wenns auch schwer geht (Ich denke ich habe dabei auch viel gelernt)

Zum Zwecke der Vollständigkeit poste ich hier jetzt meinen aktuellen Code und bedanke mich ganz Herzlich für die ganzen Hilfen




Spoiler: Meine Loesung





```
public class Main {
  
   public static void main(String[] args)
   {
       Guest heike=new Guest("Heike");
       Guest linda=new Guest("Linda");
       Guest anna=new Guest("Anna");
       Categorie alkohol=new Categorie("Alkohol");
       Categorie fleisch=new Categorie("Fleisch");
       Categorie gemuese=new Categorie("Gemüse");
      
       Party silvester=new Party("Silvester");
      
       silvester.add_guest(heike);
       silvester.add_guest(linda);
       silvester.add_guest(anna);
      
       silvester.add_categorie(alkohol);
       silvester.add_categorie(fleisch);
       silvester.add_categorie(gemuese);
      
       silvester.add_relation(alkohol, heike);
       silvester.add_relation(alkohol, linda);
      
       silvester.add_relation(gemuese, heike);
       silvester.add_relation(gemuese, anna);
       silvester.add_relation(gemuese, linda);
      
       silvester.add_relation(fleisch, heike);
       silvester.add_relation(fleisch, anna);

       alkohol.addamount(10);
       alkohol.addamount(15);
       alkohol.addamount(5);
      
       fleisch.addamount(35);
      
       gemuese.addamount(10);
       gemuese.addamount(20);
       gemuese.addamount(15);
      
       System.out.println("alkohol Kosten: "+alkohol.getcost());
       System.out.println("gemuese Kosten: "+gemuese.getcost());
       System.out.println("fleisch Kosten: "+fleisch.getcost());
      
       System.out.println("Teilnehmer an Alkohol "+alkohol.getAmountOfParticipants());
       System.out.println("Teilnehmer an Gemüse "+gemuese.getAmountOfParticipants());
       System.out.println("Teilnehmer an Fleisch "+fleisch.getAmountOfParticipants());
      
       System.out.println("Kosten pro Teilnehmer an Alkohol "+alkohol.getAmountPerParticipant());
       System.out.println("Kosten pro Teilnehmer an Gemüse "+gemuese.getAmountPerParticipant());
       System.out.println("Kosten pro Teilnehmer an Fleisch "+fleisch.getAmountPerParticipant());
      
       System.out.println("Kosten von Heike "+heike.getPersonalCosts());
       System.out.println("Kosten von Linda "+linda.getPersonalCosts());
       System.out.println("Kosten von Anna "+anna.getPersonalCosts());       
   }
}

import java.util.ArrayList;
public class Guest{
   private String name;
   private ArrayList<Categorie> Categories;
  
   public Guest(String name) {
       this.name=name;
       this.Categories=new ArrayList<Categorie>();
   }
  
   public String getName(){
       return this.name;
   }
  
   public void addCategorieReference(Categorie categorie)
   {
       this.Categories.add(categorie);
   }
  
   public int getAmountOfCategories()
   {
       return this.Categories.size();
      
   }
  
   public double getPersonalCosts()
   {
       double cost=0;
       for(Categorie categorie:this.Categories)
       {
           cost+=categorie.getAmountPerParticipant();  
       }
       return cost;
   }

}


import java.util.ArrayList;
public class Categorie {
   private String name;
   private double cost;
   private ArrayList<Guest> Guests;
  
   public Categorie (String name)
   {
       this.name=name;
       this.cost=0;
       this.Guests=new ArrayList<Guest>();
   }
  
   public void addamount(double amount)
   {
       this.cost+=amount;
   }
  
   public double getcost()
   {
       return this.cost;
   }
  
   public String getname()
   {
       return this.name;
   }
  
   public void addGuestReference(Guest guest)
   {
       this.Guests.add(guest);
   }
  
   public int getAmountOfParticipants()
   {
       return this.Guests.size();
   }
  
   public double getAmountPerParticipant()
   {
       return this.cost/this.Guests.size();
   }
}


import java.util.ArrayList;
public class Party {
  
   ArrayList<Categorie> categories;
   ArrayList<Guest> guests;
   String name;  
  
   public Party(String name)
   {
       this.name=name;
       this.categories=new ArrayList<Categorie>();
       this.guests=new ArrayList<Guest>();
   }
  
   public void add_guest(Guest guest)
   {
       guests.add(guest);
   }
  
   public void add_categorie(Categorie categorie)
   {
       categories.add(categorie);
   }
  
  
   public void add_relation(Categorie categorie,Guest guest)
   {
       categorie.addGuestReference(guest);
       guest.addCategorieReference(categorie);
   }
 
}
```

*Ausgabe:*
alkohol Kosten: 30.0
gemuese Kosten: 45.0
fleisch Kosten: 35.0
Teilnehmer an Alkohol 2
Teilnehmer an Gemüse 3
Teilnehmer an Fleisch 2
Kosten pro Teilnehmer an Alkohol 15.0
Kosten pro Teilnehmer an Gemüse 15.0
Kosten pro Teilnehmer an Fleisch 17.5
Kosten von Heike 47.5
Kosten von Linda 30.0
Kosten von Anna 32.5


----------



## mrBrown (9. Mrz 2018)

Pixi hat gesagt.:


> Ich habs jetzt auf jeden Fall geschafft die Methode zu schreiben, die genau die Beziehung zwischen zwei Objekten herstellt, die ich auch wollte. Wahrscheinlich habe ich das ganze unnötig kompliziert gemacht, aber wieso leicht wenns auch schwer geht (Ich denke ich habe dabei auch viel gelernt)


Nicht sehr kompliziert - etwas einfacher gehst allerdings 

z.B. kann sich einfach die Kategorie drum kümmern, dass sie selbst beim hinzufügen eines Gastes auch bei ihm eingetragen wird:


```
public void addGuestReference(Guest guest)
   {
       this.Guests.add(guest);
       guest.addCategorieReference(this)
   }
```


----------



## Pixi (9. Mrz 2018)

mrBrown hat gesagt.:


> Nicht sehr kompliziert - etwas einfacher gehst allerdings
> 
> z.B. kann sich einfach die Kategorie drum kümmern, dass sie selbst beim hinzufügen eines Gastes auch bei ihm eingetragen wird:
> 
> ...



dankeschön!!! Das war genau die Lösung, die ich gesucht habe)


----------



## Javinner (10. Mrz 2018)

Pixi hat gesagt.:
			
		

> Ich habs jetzt auf jeden Fall geschafft die Methode zu schreiben, die genau die Beziehung zwischen zwei Objekten herstellt


Das freut mich für dich! Weiterhin viel Erfolg  


> Das war genau die Lösung, die ich gesucht habe


#16


----------

