# KlausurÜbung- Förderband-Linked List



## Trümmermacher (23. Sep 2016)

Hi Leute , ich habe eine Klausuraufgabe und wollte wissen ob ich auf dem richtigen Weg bin wenn ich das Förderband als LinkedList erstelle ???

Im Anhang die Klausur Aufgabe


----------



## stg (23. Sep 2016)

Selten so eine schlecht gestellte Aufgabe gelesen, vieles ist vollkommen unklar, um die Aufgabe sinnvoll lösen zu können, ohne groß zu raten, was der Aufgabensteller gemeint haben könnte.

Aber gut ... das Förderband wird sicher als eine Art LinkedList implementieren zu sein, das ist schon mal richtig.


----------



## Trümmermacher (23. Sep 2016)

Ja das sagen alle unser Prof stellt wirklich die beschissensten Aufgaben in keiner Uni Klausur finde ich solche Aufgaben 

Aber danke schonmal dann bin ich ja auf dem richttigen Weg


----------



## thomasbomme (23. Sep 2016)

ehrlichgesagt kennt man sich bei der Aufgabe garnicht wirklich aus was man machen soll 
bei uns an der Uni sind die Aufgaben 1000x besser gestellt


----------



## Trümmermacher (23. Sep 2016)

Hehe ich sollte mein Profs mal die Post zeigen damit er einsieht was Ihm andauernd gesagt wird .

Also für mich ist die Frage wie groß soll dieses Förderband sein. Ich würde jetzt einfach eine DoubleLinked List machen und  bei der add methode ein buch drauf legen und wenn eins hinzukommt das erste buch weiterschieben und das neue buch kommt auf den ersten platz .

Was meint ihr????


----------



## Flown (23. Sep 2016)

Wenn du die vollständige Klausur mit der ganzen Seite lesbar hochladen würdest, dann wäre es für uns auch etwas leichter.


----------



## Trümmermacher (23. Sep 2016)

Leider ist es auch nur das was ich habe ...Hat jemand in der letzten Klausur abfotografiert .

Aber die wichtigen Inhalte sind ja alles lesbar


----------



## stg (23. Sep 2016)

Trümmermacher hat gesagt.:


> Ich würde jetzt einfach eine DoubleLinked List machen



Kannst du natürlich machen, aber wozu unnötig verkomplizieren... Wann musst du denn mal "rückwärts laufen"?


----------



## Meniskusschaden (23. Sep 2016)

Hm, ist doch eine schöne Aufgabe. Verstehe gar nicht, warum die so kritisiert wird.


Trümmermacher hat gesagt.:


> Also für mich ist die Frage wie groß soll dieses Förderband sein.


Warum ist das wichtig? Das "reale" Förderband müsste wohl 27 Plätze umfassen (26 Buchstaben plus 1 Platz zum Auflegen). Die Liste würde maximal 26 Elemente umfassen, weil man den Auflageplatz ja nicht wirklich vorhalten muß.


Trümmermacher hat gesagt.:


> Ich würde jetzt einfach eine DoubleLinked List machen und bei der add methode ein buch drauf legen und wenn eins hinzukommt das erste buch weiterschieben und das neue buch kommt auf den ersten platz .


Wobei das Weiterschieben bei einer Liste ja automatisch funktioniert, wenn man vorne einfügt. Man muß sich hier eher beim Entfernen überlegen, wie man es richtig macht.


----------



## Trümmermacher (23. Sep 2016)

Also ich hänge die ganze Zeit vor der Aufgabe und komme einfach nicht drauf wie ich anfangen soll ich weiss was ich machen will aber irgendwie fehlt mir der Code dazu kann mir vielleicht jemand ne STARTHILFE geben wäre super ..


----------



## JStein52 (23. Sep 2016)

Meniskusschaden hat gesagt.:


> Hm, ist doch eine schöne Aufgabe. Verstehe gar nicht, warum die so kritisiert wird.


Sehe ich auch so. Steht doch alles da was man wissen muss und der Rest ist Eigenleistung. Und es gibt sicher mehrere Wege zum Ziel. Aber was ist daran schlecht ?


----------



## Trümmermacher (23. Sep 2016)

Also ich würde jetzt einfache eine Linked List erstellen dann muss ich ja nicht mehr viel machen nur mit add immer wieder ein Buch der Liste(Förderband)hinzufügen das alte rutscht ja automatisch einen Platz auf oder ????


----------



## Trümmermacher (23. Sep 2016)

mein Code bisher die Aufgabe a und b wär damit abgeschlossen , oder???


```
import java.util.LinkedList;

public class Conveyor {
   
private final LinkedList<Book> förderband;
   
    public  Conveyor() {
         
             förderband= new LinkedList<>();
        
           
          }
        
       
   
   
        public void addBook(Book book){
            förderband.add(book);
           
         }
    public class Book{
        public String title;
        public Book(String title){
           
        }
    }
}
```


----------



## Meniskusschaden (23. Sep 2016)

Trümmermacher hat gesagt.:


> mein Code bisher die Aufgabe a und b wär damit abgeschlossen , oder???


Ich glaube nicht. Zumindest nicht bei dem Lösungsansatz, den ich sehe. Ich denke, wenn du mal ein Buch vom Förderband entfernst, wirst du mit deinem Ansatz auf ein Problem stossen. Das wirst du bei der Lösung von c und d aber wahrscheinlich merken.


----------



## Meniskusschaden (23. Sep 2016)

Meniskusschaden hat gesagt.:


> Trümmermacher hat gesagt.:
> 
> 
> > Also für mich ist die Frage wie groß soll dieses Förderband sein.
> ...


Habe eben beim Joggen noch einmal darüber nachgedacht und finde jetzt, dass es durchaus gute Lösungen gibt, bei denen man die Grösse kennen muß. Also vergiß meine Bemerkung lieber.


----------



## Xyz1 (23. Sep 2016)

1.-) Warum ist das nicht privat?
2.-) Mir ist das viel zu lange, hätte TL;DR druntergeschrieben und hätte schnell weggegangen.
3.-) Dann musst du aber auch mit Konsequenzen rechnen.
4.-) Was sollen wir jetzt machen? Wie solls weitergehen? Sollen wir die nicht abphotographierten Wörter auf der linken Seite raten?

Du könntest Ergänzen und Abtippen und alles in `[spoiler="Klausurübung:"][code]....[/code][/spoiler]` Einfügen...


----------



## AndiE (23. Sep 2016)

Ich denke, die Aufgabe hat es in sich.  Ich finde die Idee mit LinkedList gut. Ich möchte aber anmerken, das leere Förderband hat 27 leere Elemente, eine leere Liste aber kein Element. Es wird "Alladin" schon nach einem Takt, "Harry Potter" nach acht und "Zum blauen Kranze" erst nach sechsundzwanzig Takten vom Band genommen. Wenn Bücher entnommen werden, schrumpft ja nicht die Länge des Förderbandes, sondern der Platz wird leer. ich finde, eine einfache Übernahme der Methoden der verlinkten Liste löst die Aufgabe nicht.


----------



## stg (23. Sep 2016)

Trümmermacher hat gesagt.:


> mein Code bisher die Aufgabe a und b wär damit abgeschlossen , oder???



Nein, du darfst die LinkedList aus der Java API natürlich nicht verwenden. Du musst die Liste (jedenfalls soweit, wie hier benötigt) schon selbst implementieren.



Meniskusschaden hat gesagt.:


> Ich glaube nicht. Zumindest nicht bei dem Lösungsansatz, den ich sehe. Ich denke, wenn du mal ein Buch vom Förderband entfernst, wirst du mit deinem Ansatz auf ein Problem stossen. Das wirst du bei der Lösung von c und d aber wahrscheinlich merken.



Listen können ja auch NULL aufnehmen. Mit einer "Standard-Liste" wäre das Problem durchaus zu lösen, wenn es denn erlaubt wäre.



Meniskusschaden hat gesagt.:


> Habe eben beim Joggen noch einmal darüber nachgedacht und finde jetzt, dass es durchaus gute Lösungen gibt, bei denen man die Grösse kennen muß.



Die Länge des Förderbandes muss man wirklich nicht unbedingt wissen. Es reicht eigentlich aus zu wissen, wie viele Bücherregale es gibt, und das ist eine bekannte Konstante.




Meniskusschaden hat gesagt.:


> Hm, ist doch eine schöne Aufgabe. Verstehe gar nicht, warum die so kritisiert wird.





JStein52 hat gesagt.:


> Sehe ich auch so. Steht doch alles da was man wissen muss und der Rest ist Eigenleistung. Und es gibt sicher mehrere Wege zum Ziel. Aber was ist daran schlecht ?



Meine erste Aussage war vielleicht ein wenig zu übereilt und zu forsch, dennoch bleibe ich dabei, dass die Aufgabe ungünstig gestellt wurde, da sie einfach Interpretationsspielraum lässt. Im Aufgabentext heißt es zunächst, dass nach dem Auflegen eines Buches immer "geprüft und einsortiert" werden soll. Da wir sowohl nur eine begrenzte (konstante) Anzahl an Regalen, als auch eine durch die Anzahl an Regalen nach oben beschränkte maximale Anzahl an Büchern auf dem Band, ist es auch kein Problem diese add-Methode in konstanter Laufzeit zu implementieren. Dies setzt natürlich vorraus, dass das Band von keiner anderen Stelle maßgeblich geändert werden kann und auch zu Beginn bereits ein konsistenter Zustand gegeben ist. Was soll dann aber die öffentlich sort-Methode machen? Was ist n? In welcher Größe wächst hier die Komplexität das Problems? In der Anzahl an Regalen oder Büchern? Wir haben ja eben sogar überlegt, dass das einsortieren in jedem "add"-Schritt in konstanter Zeit möglich ist. Sonst wäre es ja auch gar nicht möglich, die add-Methode in konstanter Zeit zu implementieren. Die öffentliche sort-Methode macht dann aber keinen Sinn mehr, weil ja nach jedem add-Schritt bereits alles entsprechend einsortiert wurde. Es liegt nach außen also niemals ein Zustand vor, in dem der Aufruf der sort-Methode etwas bringen könnte.
Anders würde es aussehen, wenn add wirklich nur Bücher aufs Band legen soll und anschließend der Client die sort-Methode aufruft. Dann müsste man aber berücksichtigen, dass auch Zustände des Förderbands existieren, bei dem ein Buch bereits an seinem Regal "vorbeigelaufen" ist. Und ebenfalls, dass die Länge des Förderbands nicht mehr beschränkt ist. Dann macht es auch Sinn sich zu fragen, wie eine wachsende Anzahl an Büchern auf die Komplexität des Problems auswirkt. Das ließe sich sogar in linearer Zeit realisieren, aber ich würde drauf wetten, dass das nicht dem entspricht, was der Aufgabensteller im Sinn hatte.


----------



## Meniskusschaden (23. Sep 2016)

stg hat gesagt.:


> Nein, du darfst die LinkedList aus der Java API natürlich nicht verwenden. Du musst die Liste (jedenfalls soweit, wie hier benötigt) schon selbst implementieren.


Das kann gut sein, obwohl ich es der Aufgabenstellung nicht entnehmen konnte. Da steht doch nur, dass Arrays verboten sind. Bei der Nutzung von LinkedList o.ä. aus dem API sehe ich eher das Problem, wirklich zu garantieren, dass man die Laufzeitbedingungen einhält (siehe nächster Punkt).


stg hat gesagt.:


> Listen können ja auch NULL aufnehmen. Mit einer "Standard-Liste" wäre das Problem durchaus zu lösen, wenn es denn erlaubt wäre.


Ja, das stimmt. Allerdings könnte es bei der "Standard-Liste" schwierig werden, das Buch gegen NULL zu tauschen, denn vermutlich kostet ein einzelner Tausch mitten in der Liste bereits O(n). Man bekommt es zwar trotzdem hin, aber ich glaube, es wird komplizierter als nötig. Bei einer selbst programmierten Datenstruktur sehe ich das Problem aber auch nicht.

Was die Kritik der Aufgabenstelluing angeht, kann ich einige deiner Argumente schon nachvollziehen, komme insgesamt aber trotzdem zu einer positiven Bewertung. Ich sehe es so, dass man auf diesem Schwierigkeitsniveau beim Realitätsbezug Abstriche machen muß. Als ich die Aufgabenstellung gelesen habe, hat mir am meisten Schwierigkeiten gemacht, dass sort public ist, was du ja auch kritisiert hast. Ich habe es mir wie folgt erklärt und finde die Sichtweise relativ plausibel:
Die ersten beiden Absätze beschreiben nicht die Software, sondern das Verhalten der Sortieranlage als Gesamtsystem. Damit ist also noch nicht gesagt, dass nach dem Aufruf von add_book() schon alles erledigt ist, sondern nur, dass ein Auflegen des Buches, letztendlich diese Folgen haben wird.

Das Gesamtsystem könnte so arbeiten:
Wenn ein Buch aufgelegt wird, bemerkt das ein Sensor der Anlage. Die Anlage erkennt das Buch anhand irgendeiner erfassbaren Codierung (Barcode, RFID, ...) und ruft add_book() mit diesen Informationen auf, um die Software über dieses Ereignis zu informieren. Ausserdem startet die Anlage die Motoren der Fördertechnik.
Sobald das Förderband einen Platz vorgefahren ist, stoppt die Anlage die Motoren und ruft die Methode sort() auf. Dadurch kommt es zu Aufrufen von insertBook(), was bewirkt, dass der Entnahmemechanismus an den betreffenden Plätzen angesteuert wird.

In dem Szenario wäre die Anlage für die korrekten Aufrufe zuständig. Ich glaube, das ist auch eine sinnvolle Aufteilung der Zuständigkeiten, denn solche Anlagen wissen ja, welches Ereignis gerade stattfindet, während die Software weiß, wo welches Buch hingehört. Falls die Anlage dennoch fehlerhaft arbeitet, könnte die Software sicher einige dieser Fehler erkennen, aber kaum Fehler beheben, sondern nur alarmieren oder die Arbeit einstellen. Das übersteigt aber sicher den Rahmen der Aufgabenstellung.

Übrigens finde ich die Aufgabe - trotz einiger Vereinfachungen - ziemlich praxisrelevant, weil man sich beim Entwurf eines solchen Systems ja wirklich viele Gedanken über das Zusammenspiel der beiden Welten machen muß. Es kommt beispielsweise in Industriebetrieben sicher ziemlich häufig vor, dass die Verantwortlichen des ERP-Systems mit den Verantworlichen der Produktionsanlagen gemeinsame Lösungen finden müssen.


----------



## tommysenf (24. Sep 2016)

Meniskusschaden hat gesagt.:


> Das kann gut sein, obwohl ich es der Aufgabenstellung nicht entnehmen konnte.


In der Aufgabe steht:

... fen in dieser Aufgabe keine weiteren Klassen importieren.


----------



## Meniskusschaden (24. Sep 2016)

tommysenf hat gesagt.:


> ... fen in dieser Aufgabe keine weiteren Klassen importieren.


Das gibt's doch nicht! Die Zeile steht ja sogar in einem eigenen Absatz. Wie konnte ich die denn trotzdem übersehen?


----------



## Xyz1 (24. Sep 2016)

Meniskusschaden hat gesagt.:


> Das gibt's doch nicht! Die Zeile steht ja sogar in einem eigenen Absatz. Wie konnte ich die denn trotzdem übersehen?



Ich sag doch, viel zu lang, um ihm das mal eben grad zu machen.

Keine Weiteren kann aber auch bedeuten, keine bis auf endlich viele.

Oder anders gesagt, vielleicht steht irgendwo, dass LL benutzt werden darf.

Das hab ich aber nicht komplett gelesen, da, wie gesagt, TL;DR.

Aber ein Förderband hat Länge fest und kann ein Elem. in einem "Slot" beinhalten - oder auch leer sein. Das ist logisch. Und `n` ist natürlich die Länge des Bands - was denn sonst? Ihr seid doch nicht begriffsstutzig - oder? Und mal ganz kurz angerissen: O(1) - Entnehme am Anfang oder Ende des Bands, O(n) - Entnehme von irgendwo auf dem Band. Logisch logisch logisch. Als könntet ihr nicht nachdenken.


----------



## Trümmermacher (24. Sep 2016)

Da steht das nur Klassen aus der Referenz API importiert weden darf und das ist java -collections und von daher glaube ich schon das ich die Linked List importieren darf.


Wenn ihr schon so heiß disktuiert was wäre denn euer Lösungsansatz .

BRAUCHE DAS WIRKLICH FÜR DIE KLAUSUR ZUM ÜBEN BIN ÜBER JEDE HILFE DANKBAR


----------



## stg (24. Sep 2016)

Trümmermacher hat gesagt.:


> Da steht das nur Klassen aus der Referenz API importiert weden darf und das ist java -collections und von daher glaube ich schon das ich die Linked List importieren darf.



Wo steht, dass du aus der Referenz API importieren darfst? Was soll das überhaupt sein? Und die LinkedList liegt übrgens im package java.util...



> Wenn ihr schon so heiß disktuiert was wäre denn euer Lösungsansatz .
> BRAUCHE DAS WIRKLICH FÜR DIE KLAUSUR ZUM ÜBEN BIN ÜBER JEDE HILFE DANKBAR



Schreib die "Liste" doch einfach selbst, das ist in 3 Minuten erledigt, wenn man verstanden hat, wie so eine Liste funktioniert. Du musst ja auch gar keine vollwertge Liste implementieren, sondern nur den Teil, den du für die Lösung der Aufgabenstellung brauchst. Daher ja auch die Anmerkung "so eine Art LinkedList" aus meiner ersten Anwort.


----------



## Trümmermacher (24. Sep 2016)

Ich würde es jetzt ungefähr so machen .. ist wahrscheinlich was fehlerhaft aber weg ist richtig denke ich.

Ein Fehler ist klar ich kann das Objekt buch nicht dem FörderElement hinzufügen.

Kann mir da jemand weiterhelfen


```
public class Conveyor {
  

  private FörderElement first;
 
    public Conveyor() {
        
           
       
          
          }
       
      
  
  
        public void addBook(Book book){
           FörderElement neuesBuch = new FörderElement(book);
           neuesBuch.setNext(first);
           first=neuesBuch;
          
         }
    public class Book{
        public String title;
        public Book(String title){
          
        }
    }
    public class FörderElement {

        private String Platz;
        private FörderElement next;
       
        public FörderElement(String Platz) {
            this.Platz = Platz;
        }

        public String getPlatz() {
            return Platz;
        }

        public FörderElement getNext() {
            return next;
        }

        public void setNext(FörderElement next) {
            this.next = next;
        }
    }
}
```


----------



## stg (24. Sep 2016)

`Book` ist nunmal kein `String`


----------



## Trümmermacher (24. Sep 2016)

@stg  ja das weiss ich auch aber wie kann ich den am besten das Book dem FörderElement zu weisen.

Eine kleine Hilfe wär nett . Sollte ich am Beste dem Förderelement direkt Book als zusätzliche Instanz geben???


----------



## Trümmermacher (24. Sep 2016)

Habs jetzt so gemacht .Ist das richtig was sagt Ihr????


```
public class Conveyor {
  

  private FörderElement first;
 
    public Conveyor() {
        
           
       
          
          }
               public void addBook(Book book){
           FörderElement neuesBuch = new FörderElement(book);
           neuesBuch.setNext(first);
           first=neuesBuch;
          
         }
    public class Book{
        public String title;
        public Book(String title){
          
        }
    }
    public class FörderElement {

        private Book Platz;
        private FörderElement next;
       
        public FörderElement(Book Platz) {
            this.Platz = Platz;
        }

        public Book getPlatz() {
            return Platz;
        }

        public FörderElement getNext() {
            return next;
        }

        public void setNext(FörderElement next) {
            this.next = next;
        }
    }
}
```


----------



## AndiE (24. Sep 2016)

Weiß jemand, wie das mit dem "public void sort(Shelf[] shelfs)" gemeint ist? Im Text steht, dass diese Funktion die Bücher vom Band nimmt. OK- aber was steht dann in "shelfs"? Und wenn in "shelfs" eine Sammlung der Positionen steht, wo Bücher entnommen werden sollen, was soll die Funktion dann machen? Soll sie nur ausgeben" Buch an Position X entnommen" ?


----------



## Meniskusschaden (24. Sep 2016)

Trümmermacher hat gesagt.:


> Ist das richtig was sagt Ihr????


Warum testest du es nicht einfach?

Du hast eine innere Klasse Book erstellt. Die Aufgabenstellung enthält jedoch bereits eine Klasse Book. Außerdem ist der Methodenname addBook falsch. Ansonsten sollte es aber funktionieren. Ich würde aber die Variablennamen überdenken. Es ist verwirrend, wenn eine Variable z.B. neuesBuch heisst, obwohl sie auf ein FörderElement verweist.


----------



## Meniskusschaden (24. Sep 2016)

AndiE hat gesagt.:


> Weiß jemand, wie das mit dem "public void sort(Shelf[] shelfs)" gemeint ist? Im Text steht, dass diese Funktion die Bücher vom Band nimmt. OK- aber was steht dann in "shelfs"? Und wenn in "shelfs" eine Sammlung der Positionen steht, wo Bücher entnommen werden sollen, was soll die Funktion dann machen? Soll sie nur ausgeben" Buch an Position X entnommen" ?


Ich würde sagen, die Methode sort() entnimmt Bücher vom Förderband und legt sie in die Regale, die im Array shelves gespeichert sind. Ein Array-Eintrag repräsentiert ein Regal.


----------



## Trümmermacher (24. Sep 2016)

@Meniskusschaden Die Klasse Book ist der nachbau der klasse Book die ich einfach anstatt eine extra klasse als innere klasse erstellt habe . 

Und addBook als Name ist falsch wieso weil der UNterstrich fehlt ???


----------



## Meniskusschaden (24. Sep 2016)

Trümmermacher hat gesagt.:


> Und addBook als Name ist falsch wieso weil der UNterstrich fehlt ???


Ja


----------



## AndiE (25. Sep 2016)

Ich habe die Aufgabe schon teilweise gelöst, und mein Code sieht ganz anders aus. Natürlich poste ich ihn nicht, das wäre ja langweilig. Ich kann aber versuchen, mein Vorgehen zu erklären. Ich finde, ein Förderband hat immer N Datenelemente. Lege ich etwas auf ein Förderband, kommt KEIN Datenelement hinzu, sondern der STATUS des Datenelementes ändert sich. Hier ist für mich der entscheidende Unterschied zu Liste. Eine leere Liste hat kein Datenelement und das Hinzufügen eines Datenelementes verlängert auch die Liste. Ich habe als erstes implementiert, dass sich nach Auflegen dreier Bücher das Förderband so verhält, dass drei Plätze mit den Büchern belegt sind, und alle anderen Plätze des Förderbandes leer sind. Die Frage, ob das Buch an der richtigen Stelle liegt, lässt sich auch recht einfach dabei lösen.


----------



## Trümmermacher (25. Sep 2016)

Aber es soll ja immer nur ein Buch aufgelegt werden und dann soll das förderband einen platz nach vorne laufen. DAs mit den n elementen ist eine gute Idee aber dasmit den drei  büchern wär aufjedenfall nicht das was bei der Aufgabe verlangt wird.

Ich würde mich aber sehr freuen wenn du deinen Code posten würdest da ich morgen  nachmittag meine Klausur habe und das die einzige Aufgabe ist die ich bisher nicht gelöst habe


----------



## Trümmermacher (25. Sep 2016)

meine Version mit nItems

```
public class Conveyor {
    

      private FörderElement first;
     int nItems;
        public Conveyor() {
            this.first = null;
            this.nItems = 0;
             
         
            
              }
                   public void addBook(Book book){
               FörderElement neuesBuch = new FörderElement(book);
               neuesBuch.setNext(first);
               first=neuesBuch;
            
             }
        public class Book{
            public String title;
            public Book(String title){
            
            }
        }
        public class FörderElement {

            private Book Platz;
            private FörderElement next;
         
            public FörderElement(Book Platz) {
                this.Platz = Platz;
            }

            public Book getPlatz() {
                return Platz;
            }

            public FörderElement getNext() {
                return next;
            }

            public void setNext(FörderElement next) {
                this.next = next;
            }
        }
    }
```

hier nochmal eine abgeänderte Art der addMethode

```
public void addBook(Book book){
               FörderElement neuesBuch = new FörderElement(book);
               if(first==null)
                   first= neuesBuch;
               if(first!=null)
               neuesBuch.setNext(first);
               first=neuesBuch;
             
             }
```


----------



## AndiE (25. Sep 2016)

```
package library;

public class Storage {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Conveyor c= new Conveyor();
        Book b1= new Book("Alladin");
        c.add_book(b1);
        Book b2= new Book("HarryPotter");
        c.add_book(b2);
        Book b3= new Book("Zum grünen Kranze");
        c.add_book(b3);
    }

}
```


```
package library;

import java.util.LinkedList;

public class Conveyor {
   
    LinkedList<Book> chain;
    int LENGTH=26;
   
   
   
    public Conveyor(){
        chain= new LinkedList<Book>();
        int i;
        for (i=0;i<LENGTH;i++){
            Book b= new Book("empty");
            chain.add(b);
        }
    }
   
    /**
     *
     * @param book
     * add a book
     */
    public void add_book(Book book){
        //Insert book on end of List
        chain.add(book);
        //delete book at begin of list
        chain.remove();
        //check books on chain
        int i=0;
        for( Book b : chain){
            System.out.print(b.title+".");
            String t= b.title;
            Boolean push= check(t.charAt(0),i);
            if(push){
                System.out.print("t ");
            }
            else{
                System.out.print("f ");
            }           
           
        }
        System.out.println("\nTakt abgeschlossen");
    }
   
    /**
     *
     * @param first_letter
     * @param index
     * @return
     * is index the same as the first letter of the book
     */
   
    public boolean check(char first_letter,int index){
        return false;
    }

    /**
     *
     * @param shelfs
     *
     * Insert the books to the shelfs
     */
    public void sort(Shelf[] shelfs){
       
    }
   
}
```
Das ist meine Idee. ich denke, der Quelltext ist weitgehend selbsterklärend.


----------



## Trümmermacher (25. Sep 2016)

Hier haben wir aber wieder das Problem das es keine selber implemtierte Liste ist .


----------



## Xyz1 (26. Sep 2016)

Nun hab ich es auch mal durchexerziert, das ist das Ergebnis:

```
/**
* @author
*/
public class JavaApplication5 {

    public static void main(String[] args) {
        Shelf[] shelfs = new Shelf['z' - 'a' + 1];
        for (int i = 0; i < shelfs.length; i++) {
            shelfs[i] = new Shelf();
        }
        Conveyor conve = new Conveyor();
        conve.add_book(new Book("h wie habicht"));
        conve.add_book(new Book("hormone natürlich regulieren"));
        conve.add_book(new Book("hypovolämischer schock"));
        conve.add_book(new Book("hüftchirurgie"));
        conve.add_book(new Book("herausforderung motivation: denkpräferenzen und ihr einfluss auf engagement und handeln im beruf"));
        conve.sort(shelfs);
        System.out.println(shelfs[7].llb); // Debug
        System.out.println("");
        System.out.println(shelfs[7].get_book("hüftchirurgie").title);
        System.out.println("");
        System.out.println(shelfs[7].llb); // Debug
    }
}

class Book {

    String title;

    Book(String title) {
        this.title = title;
    }

    @Override
    public boolean equals(Object obj) {
        return this.title.equalsIgnoreCase(((Book) obj).title);
    }

}

class Shelf {

    LinkedList<Book> llb = new LinkedList<>();

    Shelf() {

    }

    void insert_book(Book book) {
        llb.add(book);
    }

    Book get_book(String title) {
        return llb.remove(llb.indexOf(new Book(title)));
    }
}

class Conveyor {

    LinkedList<Book> llb = new LinkedList<>();

    Conveyor() {
        for (char c = 'a'; c <= 'z'; c++) {
            llb.add(null);
        }
    }

    void add_book(Book book) {
        llb.removeLast();
        llb.addFirst(book);
    }

    boolean check(char first_letter, int index) {
        return first_letter - 'a' == index;
    }

    void sort(Shelf[] shelfs) {
        for (int i = 0; i < llb.size(); i++) {
            Book b = llb.removeLast();
            llb.addFirst(null);
            if (b != null) {
                for (int j = 0; j < shelfs.length; j++) {
                    if (check(b.title.charAt(0), j)) {
                        shelfs[j].insert_book(b);
                    }
                }
            }
        }
    }
}
```

Mir sind einige Dinge aufgefallen, die nicht sinnvoll erscheinen,
du sollst ja nur Conveyor, add_book, check und sort implementieren,
wie lang ist dieses Förderband?,
was passiert, wenn es voll ist?,
Bücher fallen hinten weg?,
das Förderband kann "einmal komplett gedreht werden" in O (n),
aber in O (n) kann ich nicht alle Bücher einsortieren,
siehe Schleife in einer Schleife.

Keine weiteren Kallsen importieren, das hab ich ignoriert... 

Ich hab ne Idee, zeichne dieses Förderband mit den Regalen einmal räumlich auf! Dann wissen wir alle, was gemeint ist, ohne Raten.


----------



## Meniskusschaden (26. Sep 2016)

Laut Aufgabenstellung soll auf jedes add_book() ein sort() folgen, bevor das nächste add_book() aufgerufen wird. Deshalb kann das: 





DerWissende hat gesagt.:


> was passiert, wenn es voll ist?,
> Bücher fallen hinten weg?,


nicht passieren (zumindest nicht, solange die Bücher keine seltsamen Anfangszeichen haben).


DerWissende hat gesagt.:


> aber in O (n) kann ich nicht alle Bücher einsortieren,
> siehe Schleife in einer Schleife.


Auf die innere Schleife kann man ja verzichten, wenn man die Prüfung bereits in der äußeren Schleife vornimmt.


----------



## Xyz1 (26. Sep 2016)

Meniskusschaden hat gesagt.:


> Laut Aufgabenstellung soll auf jedes add_book() ein sort() folgen, bevor das nächste add_book() aufgerufen wird. Deshalb kann das: nicht passieren (zumindest nicht, solange die Bücher keine seltsamen Anfangszeichen haben).



Das hab ich nirgendwo gelesen, das ist ein völlig neuer Aspekt. Dann können Buch in O (n) einsortiert werden, indem einmal an den Regalen langgerattert wird!

Das ist ein völlig neuer Aspekt. Dann hat das Förderband nur 1 Platz!!! Und ist mehr ein Schiebearm.

Dann brauchts auch `LinkedList` nicht.

Das hättest du auch mal eher aufklären können.


----------



## Meniskusschaden (26. Sep 2016)

DerWissende hat gesagt.:


> Das hab ich nirgendwo gelesen, das ist ein völlig neuer Aspekt. Dann können Buch in O (n) einsortiert werden, indem einmal an den Regalen langgerattert wird!


Virtuell kann man das zwar machen, aber das "echte" Förderband bewegt sich für ein add_book() nur um eine Position weiter.


DerWissende hat gesagt.:


> Das ist ein völlig neuer Aspekt. Dann hat das Förderband nur 1 Platz!!! Und ist mehr ein Schiebearm.


Aus dem Grund im vorigen Absatz braucht man deshalb dann doch 26 oder 27 Plätze.


----------



## Xyz1 (26. Sep 2016)

Zeichne das doch mal auf!!!

```
Regal 'A', Regal 'B', Regal 'C'   <--- Shelfs
=>________ Blut...___ _________=> <--- Förderband (mit 1 Buch)

// es fährt in O(n) einmal "an allen Regalen entlang", bis das Buch beim richtigen Regal ist???
```


----------



## Meniskusschaden (26. Sep 2016)

Okay, habe mal versucht, es im Anhang darzustellen. Die Regale sind waagerecht eingezeichnet (mit der Bücherbestückung nach dem letzten Takt) und die senkrechten Elemente stellen das Förderband im Zeitverlauf für die ersten sieben Takte dar.


----------



## Xyz1 (26. Sep 2016)

Dann kann wieder nicht in O (n) einsortiert werden, da ich jedes Regal ja mal ansteuern muss mit "check".

Also das Band läuft einmal an allen Regalen entlang? Dann muss ich in jedem Schritt auch jedes Regal "checken".

Naja, das Thema verwirrt mich, ich bin draußen.


----------



## Meniskusschaden (26. Sep 2016)

DerWissende hat gesagt.:


> Dann kann wieder nicht in O (n) einsortiert werden, da ich jedes Regal ja mal ansteuern muss mit "check"


Aber das reicht doch auch. check() braucht ja nur O(1).


DerWissende hat gesagt.:


> Also das Band läuft einmal an allen Regalen entlang? Dann muss ich in jedem Schritt auch jedes Regal "checken".


Ja, aber pro Auflegeaktion eben nur einen Schritt. Wenn man keine weiteren Bücher mehr auflegt, bleibt es stehen - auch falls es noch nicht leer ist.


----------



## AndiE (26. Sep 2016)

Vielleicht ist damit auch gemeint, dass, wenn ich 26 Bücher von Z beginnend bis A auf das Laufband lege, 25 mal für jedes Regal ein Check ausgeführt wird, ohne dass ein Buch entfernt wird. Erst beim 26. Schritt liegen alle Bücher richtig und werden nach wiederum 26 Checks alle zusammen vom Band genommen.


----------



## Xyz1 (27. Sep 2016)

Eine Sache ist unklar, ich muss erst das Band weiterbewegen und dann ein neues Buch auflegen. In der Aufgabenstellung steht aber:
Wird ein neues Buch , bewegt sich das Förderband vorwärts und alle Bücher wandern genau einen Regalplatz .
Wenn ich es danach weiterbewege, und zum Beispiel A wie Anton aufgelegt wird, verpasse ich ja das erste Regal mit 'A'.
Und es stimmt, nach jeder Bewegung wird für jedes Regal/Buch geprüft, ob es an der richtigen Stelle ist, und dann ggf. vom Band genommen - das kann natürlich in O (n) geschehen. Alle Bücher einsortieren, die auf dem Band an der falschen Stelle sind, hingegen nich!!!!


----------



## Meniskusschaden (27. Sep 2016)

DerWissende hat gesagt.:


> Eine Sache ist unklar, ich muss erst das Band weiterbewegen und dann ein neues Buch auflegen. In der Aufgabenstellung steht aber:
> Wird ein neues Buch , bewegt sich das Förderband vorwärts und alle Bücher wandern genau einen Regalplatz .
> Wenn ich es danach weiterbewege, und zum Beispiel A wie Anton aufgelegt wird, verpasse ich ja das erste Regal mit 'A'.


Das Band wird nur nach dem Auflegen eines Buches weiterbewegt, nicht vorher. Ich stelle es mir so vor, dass es einen dedizierten Auflegeplatz gibt, so dass ein Buch nicht sofort nach dem Auflegen auf Position A liegt, sondern erst nach dem ersten Förderband-Takt.


DerWissende hat gesagt.:


> Und es stimmt, nach jeder Bewegung wird für jedes Regal/Buch geprüft, ob es an der richtigen Stelle ist, und dann ggf. vom Band genommen - das kann natürlich in O (n) geschehen. Alle Bücher einsortieren, die auf dem Band an der falschen Stelle sind, hingegen nich!!!!


Das sehe ich auch so. Für die Aufgabe wird ja zum Glück nur gefordert, dass ein Aufruf von sort() in O(n) abgeschlossen wird.


----------



## Meniskusschaden (27. Sep 2016)

AndiE hat gesagt.:


> Vielleicht ist damit auch gemeint, dass, wenn ich 26 Bücher von Z beginnend bis A auf das Laufband lege, 25 mal für jedes Regal ein Check ausgeführt wird, ohne dass ein Buch entfernt wird. Erst beim 26. Schritt liegen alle Bücher richtig und werden nach wiederum 26 Checks alle zusammen vom Band genommen.


Möglicherweise ist das wirklich der Punkt, der in diesem Thread teilweise für Verwirrung gesorgt hat. Aber ich glaube, wenn man die Aufgabe sorgfältig liest, ist es letztlich doch eindeutig, dass sich O(n) auf einen sort()-Aufruf bezieht, also für jede Förderbandposition einmal zu prüfen, ob sie sich gerade vor dem richtigen Regal befindet.


----------



## Xyz1 (27. Sep 2016)

Meniskusschaden hat gesagt.:


> Ich stelle es mir so vor, dass es einen dedizierten Auflegeplatz gibt, so dass ein Buch nicht sofort nach dem Auflegen auf Position A liegt, sondern erst nach dem ersten Förderband-Takt.



Das ist in der Aufgabenstellung nicht (explizit) erwähnt. Das lässt Interpretationsspielraum. 

Aber stimmig ist es - es gibt eine extra Auflageplatz, der nicht direkt zum Förderband gehört. (GehörtE er zum Förderband, würdn alle Indizes nicht mehr stimmen!)

Ich werd das mal abändern/modifizieren und melde mich dann nochma.

Edit, es gibt allerdings einen kleinen Konflikt, einer LL kann ich ein Elem. removen in O (1) [siehe Iterator], aber nicht "ersetzen" durch `null`. 

Für was Eigenes bin ich etwas zu faul, das ist, round about, 2. Semester stuff.


----------



## stg (27. Sep 2016)

Wird's dir eigentlich nie langweilig?


----------



## Meniskusschaden (27. Sep 2016)

DerWissende hat gesagt.:


> Aber stimmig ist es - es gibt eine extra Auflageplatz, der nicht direkt zum Förderband gehört. (GehörtE er zum Förderband, würdn alle Indizes nicht mehr stimmen!)


Das echte Förderband könnte auch so lang sein, dass immer 27 Plätze auf der Oberseite sind, 27 Plätze kopfüber unten für den Rücklauf und falls nötig noch einer oder zwei für die Umlenkung am Bandende. Dann kann der Auflegeplatz auch zum Förderband gehören. Für die Datenstruktur würden ja trotzdem 27 Positionen genügen.


----------



## Xyz1 (27. Sep 2016)

stg hat gesagt.:


> Wird's dir eigentlich nie langweilig?



Was heißt langweilig? Dass das Thema sehr lang werden wird, hätte ich ja vorher wissen können, bevor ich hier einstieg. 

Wer weiß, wie die Klausur gelaufen ist, vielleicht bringt das vorher lernen ja auch nix.


----------

