sunny: Verkettete Listen "dynamisch" verschachteln

Beitrag lesen

Hallo!

Vielen Dank erstmal für Deine ausführliche Antwort!

Am Ende soll es also eine BagList-Liste "Bags" geben, die beliebig viele "BagWithPresents" enthält, und diese einzelnen "BagWithPresents" sollen dann beliebig viele "Present"s enthalten. Wieviele "Present"s das sind, kommt aus einer User-Eingabe, wieviele "Bags" benötigt werden kann ebenfalls erst zur Laufzeit (durch den Algorithmus für das Verteilen) festgelegt werden, das mit der Numerierung war also fürs Testen zwar noch irgendwie möglich, führt aber natürlich nicht zu einer Lösung. Wie kann ich so etwas "richtig" machen? Sodass die Objekte sozusagen "dynamisch" erstellt werden?

Du erläuterst dein Problem leider nicht so, dass ich es verstehen würde und den relevante Code, nämlich die Implementierung von BagList und Bag verheimlichst du aber.

Nur deswegen, weil mein Problem nicht in der Implementierung der Listen an sich liegt, sondern im "dynamischen" umgehen mit den Listen ... weil ich eben in Java Anfänger bin, wusste ich nicht so recht, wie ich hier dynamisch mehrere Objekte erstellen soll, die ich später auch wieder ansprechen kann (mit Arrays wäre dies für mich klar gewesen, einfach über die Indizes).

Ich vermute jetzt mal einfach, dass BagList nichts anderes als ein Wrapper für ein Bag[]-Array und Bag ein Wrapper für ein Present[]-Array sind. Und ich vermute, dass dein Problem die feste Größe der primitiven Java-Arrays sind, richtig?

Nein, das stimmt nicht. Arrays kommen darin gar nicht vor, es handelt sich lediglich um die Implementierung von einfach verketteten Listen, mit einer add-Methode (sodass Objekte zur Liste hinzugefügt werden können), einer print-Methode für Testzwecke usw.

Auszug aus der BagList-Klasse (vielleicht wird es dann verständlicher was ich da fabriziere):

  
 public Bag begin; //First bag in list  
 public Bag end; //Last bag in list  
  
 //Method to add present in bag  
 public void add(Bag obj) {  
  
  //Instance new element in queue  
  Bag newBag = new Bag(obj);  
  
  //If it's the first present in bag, set new element as first element  
  if (begin == null && end == null) {  
   begin = newBag;  
  }  
  //If it's the second present in bag, set new element as last element  
  else if (begin != null && end == null) {  
   begin.next = newBag;  
   end = begin.next;  
  }  
  //Else set present as last element  
  else {  
   end.next = newBag;  
   end = end.next;  
  }  
 }  
  

Kennst du [link:http://java.sun.com/javase/6/docs/api/java/util/LinkedList.html@title=java.util.LinkedList] und [link:http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html@title=java.util.ArrayList]?

Kenne ich, darf ich aber nicht verwenden. Wir müssen die Liste selber implementieren und dürfen keine solchen Strukturen verwenden.

Helfen dir diese beide Klassen dein Problem zu lösen?

Nein, aber mittlerweile bin ich selber schon einen Schritt weitergekommen. Ich muss in meine Liste ja "nur" eine weitere Methode implementieren, die mir das benötigte Objekt (den Bag) zurückliefert, sodass ich dann dort wieder (Unter-)Objekte (die Presents) einfügen kann (mit meiner "add"-Methode). So müsste ich auf meine Bags zugreifen können und somit sollte es auch möglich sein, den best-fit-Algorithmus zu implementieren. Ich weiß, die Frage war fast außerordentlich blöd, aber wenn man mit einer Sprache neu anfängt, so verstrickt man sich oft selber in irgendwelche falschen "alten" Denkweisen aus bereits bekannteren Dingen ... und ist dann völlig verwirrt. Von Objektorientierung hab ich nämlich eigentlich keinen Plan und daher fällt mir das alles im Moment ein wenig schwer.

Vieleicht möchtest du dich allgemein erstmal etwas zu den verschiedenen Algorithmen und Datenstrukturen, die in Java bereits implementiert sind belesen:

http://www.galileocomputing.de/openbook/javainsel6/javainsel_11_001.htm
http://java.sun.com/javase/6/docs/technotes/guides/collections/index.html

Ja genau die darf ich ja nicht verwenden ... *grummel*.
Btw, oberen Link ("Java ist auch eine Insel") hab ich ohnehin andauernd in Verwendung, mittlerweile sogar so oft, dass ich mir jetzt zusätzlich die Buch-Version bestellt habe, ich glaube damit kann man echt gut lernen, gefällt mir gut.

Andererseits, könntest du natürlich auch (wenn also die Kapazität der Arrays tatsächlich dein Problem ist) auch selber eine ähnliche Implementierung wie die Standard-Java-Datenstrukturen vornehmen.

* Starte mit einer initialen Kapazität,
* Prüfe bei jedem add() ob die aktuelle Kapazität überschritten wird,
* falls ja, leg ein neues Array mit größerer Kapazität an,
* kopiere das alte Array in das neue mittels [link:http://java.sun.com/javase/6/docs/api/java/lang/System.html#arraycopy(java.lang.Object,%20int,%20java.lang.Object,%20int,%20int)@title=java.util.System.arraycopy()]

Ja, naja, das kommt nicht ganz hin, aber so etwas Ähnliches: Erstelle einen Bag und füge ihn der Liste hinzu, nimm das erste Present und stecke es in den Bag. Wenn das zweite Present noch hineinpasst, packe es dazu, ansonsten mache einen neuen Bag und stecke es dort hinein. Dann nimm das nächste Geschenk, prüfe die bereits vorhandenen Bags und packe das Present in den Bag, in welchen es am besten hineinpasst (wo die Differenz zwischen dem Maximalgewicht des Bags und dem aktuellen Gewicht nach zufügen des Presents am geringsten ist). So jedenfalls glaube ich, dass der best-fit-Algorithmus funktionieren soll, aber das muss ich mir erst ansehen, wenn der "Zugriff" auf die einzelnen Bags erstmal funktioniert, ich mach das immer so Schritt für Schritt.

Bevor ich also wirklich zum Implementieren des best-fit-Algorithmus komme, muss ich erst noch so eine "getBag"-Methode irgendwie hinbekommen (die mir den später den "besten" Bag liefern soll), ich denke so könnte das Ganze funktionieren ... da bin ich jetzt gerade dabei.

Ansonsten noch eine kurze Anmerkung:

BagList Bags = new BagList();
// Variablen-Bezeichner bitte immer klein schreiben

Bags.add(BagWithPresents2);
// da dies sonst wie ein statischer Aufruf der add() Methode einer Bags-Klasse aussieht
// [...]

  
Du hast Recht. Mach ich immer, aber komischerweise nicht bei Objekten. Werde das beheben. Danke!  
  
Liebe Grüße  
sunny