Methoden "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen

Dieses Thema Methoden - "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen im Forum "Allgemeine Java-Themen" wurde erstellt von sapcandy, 27. Nov. 2016.

Thema: "Unschöne" Break-Anweisung aus verschachtelter Funktion entfernen Hallo zusammen, aus dem nachfolgendem Codestück möchte ich die Break-Anweisung entfernen, um ein besseren Quellcode...

  1. Hallo zusammen,

    aus dem nachfolgendem Codestück möchte ich die Break-Anweisung entfernen, um ein besseren Quellcode zu haben.

    Code (Java):
    for (int aktuelleLadung : loadList.beladung) {
                for (Container aktuellerContainer : container) {
                    if (aktuellerContainer.freierPlatzFuer(aktuelleLadung)) {
                        aktuellerContainer.speicherLadung(aktuelleLadung);
                        break;
                    }
                }
            }
    Es handelt sich hierbei um einen Algorithmus für das "bin-packing". Entferne ich das Break, wird jeder Container immer wieder mit den gleichen Paketen gefüllt. Leider haben meine bisherigen Versuche nicht zum gewünschten Erfolg geführt.
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Nach welchem Schema sollen die Container denn gefüllt werden? Soll die Ladung gleich verteilt werden oder jeweils so viel wie möglich auf einen einzelnen Container?
     
  4. Warum ist der dann besser ?
     
  5. Meiner Meinung nach ist es besser, wenn ein break drin steht (falls benötigt).
    Beispielsweise du hast eine Liste mit int-Werten.
    Jetzt suchst du eine spezielle Zahl. Angenommen die Liste hat 10.000 Elemente und die gesuchte Zahl steht an 4. Stelle. Mit einem break läufst du jetzt bis zum 4. Element, ohne Break läuft er komplett durch.

    An deiner Stelle wird ja nur die innere Schleife abgebrochen, was Sinn macht.
    Ich denke allerdings, dass du die 2 For-Schleifen tauschen müsstest, oder?
    Angenommen du hast 3 leere Container, in die jeweils die Zahl 100 reinpasst. Dann befüllst du alle 3 Container mit 100. Aber eine Ladung kann doch nur in einen Container, oder?
     
  6. Du hast eine Ladeliste deren Ladungen du auf Container verteilen musst. Und du hast eine Reihe von Containern auf die du die Ladungen verteilen musst. Wenn du einen passenden Container gefunden hast dann musst du diese Schleife beenden und mit der nächsten Ladung weitermachen. Warum willst du jetzt Verrenkungen machen um den Code den du jetzt hast kryptischer zu machen um ein break wegzukriegen ?
     
  7. Es wird sowohl First-Fit, also auch First-Fit-Decreasing benutzt.

    Gewohnt aus meiner Prog-Anfangszeit, wurde damals nicht gerne gesehen. (Gab auch massiven Punktabzug)

    Verwende ich break im Algorithmus, läuft mein Programm wie gewünscht (kann den Quellcode gerne per PM teilen). Eine Ladung kann logischerweise, wie du sagtest, nur einmal verladen werden. Entferne ich break, werden die Ladungen in den Container zwar geladen, stehen allerdings dann wieder für die anderen Container zur Verfügung.

    Vielen Dank für die Diskussion.
     
  8. Du könntest Alternativ, statt die Container innerhalb der Ladung zu iterieren, die Ladung innerhalb der Container durchlaufen. Also der Reihe nach die Container befüllen, bis sie voll sind.

    Edit: Das würde es nur noch schwieriger machen, ich hab' Mist erzählt.
     
  9. Ist eine ganz normale Anweisung in Java und dient zum vorzeitigen Verlassen einer Schleife. Da ist nichts schlimmes dabei (solange man sie nicht total unübersichtlich einsetzt) und über einen Punktabzug würde ich mich dabei beschweren !
     
  10. Würde auch nicht ganz der Aufgabe entsprechen die lautet, alle Ladungen der Reihe nach auf die Container zu verteilen, und zwar jede Ladung auf den nächsten Container der noch genug Platz hat.
     
  11. Oder einfach das Suchen des passenden Containers in eine eigene Funktion auslagern, dann erübrigt sich die innere Schleife und es bleiben nur zwei Methodenaufrufe.
     
  12. Aber auch da muss er über alle Container gehen und wenn er den nächsten passenden gefunden hat die Schleife beenden ;);)
     
  13. container.stream().filter(aktuellerContainer -> aktuellerContainer.freierPlatzFuer(aktuelleLadung)).findFirst()

    Ganz ohne Break ;P

    Und wenn das break in einer eigenen Funktion ständ, würds in dieser nicht mehr stören ;)
     
  14. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!