Ich würde jetzt einfach eine DoubleLinked List machen
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ß.Also für mich ist die Frage wie groß soll dieses Förderband sein.
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.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 .
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 ?Hm, ist doch eine schöne Aufgabe. Verstehe gar nicht, warum die so kritisiert wird.
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){
}
}
}
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.mein Code bisher die Aufgabe a und b wär damit abgeschlossen , oder???
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.Warum ist das wichtig?Also für mich ist die Frage wie groß soll dieses Förderband sein.
[spoiler="Klausurübung:"][code]....[/code][/spoiler]
Einfügen...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.
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ß.
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 ?
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).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.
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.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.
In der Aufgabe steht:Das kann gut sein, obwohl ich es der Aufgabenstellung nicht entnehmen konnte.
Das gibt's doch nicht! Die Zeile steht ja sogar in einem eigenen Absatz. Wie konnte ich die denn trotzdem übersehen?... 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?
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. 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
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;
}
}
}
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;
}
}
}
Warum testest du es nicht einfach?Ist das richtig was sagt Ihr????
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.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" ?
JaUnd addBook als Name ist falsch wieso weil der UNterstrich fehlt ???
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;
}
}
}
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;
}
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){
}
}
/**
* @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);
}
}
}
}
}
}
nicht passieren (zumindest nicht, solange die Bücher keine seltsamen Anfangszeichen haben).was passiert, wenn es voll ist?,
Bücher fallen hinten weg?,
Auf die innere Schleife kann man ja verzichten, wenn man die Prüfung bereits in der äußeren Schleife vornimmt.aber in O (n) kann ich nicht alle Bücher einsortieren,
siehe Schleife in einer Schleife.
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).
LinkedList
nicht.Virtuell kann man das zwar machen, aber das "echte" Förderband bewegt sich für ein add_book() nur um eine Position weiter.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!
Aus dem Grund im vorigen Absatz braucht man deshalb dann doch 26 oder 27 Plätze.Das ist ein völlig neuer Aspekt. Dann hat das Förderband nur 1 Platz!!! Und ist mehr ein Schiebearm.
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???
Aber das reicht doch auch. check() braucht ja nur O(1).Dann kann wieder nicht in O (n) einsortiert werden, da ich jedes Regal ja mal ansteuern muss mit "check"
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.Also das Band läuft einmal an allen Regalen entlang? Dann muss ich in jedem Schritt auch jedes Regal "checken".
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.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 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.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!!!!
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.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.