Collection Buch

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Collection Buch

    Hallo Liebe Java freunde!!! :)

    Ich habe hier ein kleines Problem mit Collections also :

    Ich möchte eine Bibliothek erzeugen die beliebig viele Bücher speichern kann...

    Die Bibliothek hat folgende Methoden

    einfügen (Buch b) : boolean
    sucheNachAutor(String autor): Collection <Buch>
    sucheNachISBN(String isbn): Buch
    bestandSortierenNach(Comparator<Buch> buch):Collection<Buch>

    Das Buch ist folgendermaßen aufgebaut
    String autor
    String isbn
    String title

    (hinter dem Doppelpunkt steht immer der rückgabe wert der Methode)

    So nun hab ich das ganze mal angefangen :
    erst mal die Klasse Buch:

    Quellcode

    1. public class Buch {
    2. protected String autor;
    3. protected String isbn;
    4. protected String title;
    5. public Buch(String autor, String isbn, String title){
    6. this.autor=autor;
    7. this.isbn=isbn;
    8. this.title=title;
    9. }
    10. }
    Alles anzeigen


    als nächste die Klasse Bibliothek:

    Quellcode

    1. package Bibliothek;
    2. import java.util.*;
    3. public class Bibliothek {
    4. //instanzvariablen
    5. LinkedList <Buch> bib;
    6. Iterator <Buch> iter = bib.iterator();
    7. ArrayList <Buch> autor;
    8. public Bibliothek(){
    9. erzeugen der List
    10. this.bib=new LinkedList();
    11. }
    12. // fügt ein Object vom Typ Buch in die List ein wenn es geklappt hat true sonst false
    13. public boolean einfügen(Buch b){
    14. while(iter.hasNext()){
    15. if(iter.next() == null){
    16. bib.add(b);
    17. return true;
    18. }
    19. }
    20. return false;
    21. }
    22. //sucheNachAutor erstellt eine Collection und liefert alle bücher des Autors zurück
    23. public Buch sucheNachAutor(String autor){
    24. this.autor=new ArrayList();
    25. for(Buch b: bib ){
    26. if(iter.next().autor == autor){
    27. this.autor.add(iter);
    28. return this.autor;
    29. }
    30. }return null;
    31. }
    32. //sucht nach ISBN nummer und liefert das entsprechende Buch zurück
    33. public Buch sucheNachISBN(String isbn){
    34. for(Buch b: bib){
    35. if(iter.next().isbn==isbn){
    36. return b;
    37. }
    38. }return null;
    39. }
    40. //Sortiert Die Collection nach parameter comp
    41. //public Buch bestandSortierenNach(){
    42. //}
    43. }
    Alles anzeigen


    So nun zu meinen Fragen:
    1. Geht das hier überhaupt:

    Quellcode

    1. public boolean einfügen(Buch b){
    2. while(iter.hasNext()){
    3. if(iter.next() == null){


    Hat der Iterator hier überhaupt schon ein Element denn hier füge ich ja erst noch Bücher ein ?

    2. Hauptsächlich habe ich mit der Collection sucheNachAutor probleme :

    Quellcode

    1. this.autor=new ArrayList();
    2. for(Buch b: bib ){
    3. if(iter.next().autor == autor){
    4. this.autor.add(iter);
    5. return this.autor;
    6. }
    7. }return null;


    Denn hier möchte ich ja folgendermaßen vorgehen ich suche nach einem Autor durchlaufe die Liste wenn ich nun ein Buch mit dem Autor gefunden habe füge ich dieses zur Collection ArrayList hinzu so nun ist aber die Frage wie sag ich das denn ?? also wie kann ich mit dem iterator auf das Element zugreifen von dem ich gerade Festgestellt habe es hat den gleichen autor ???? hoffe man versteht die frage

    3. habe ich das gleiche Probemle mit der sucheNachISBN denn hier weiß ich auch nicht was ich denn jetzt returnen muss eigentlich das Objekt auf dem der Iterator gerade steht und für das gilt isbn== isbn ????

    4. bie bestandSortiereNach habe ich gar keine Idee deshalb wäre ein lösungsansatz oder ähnliches sehr hilfreich ????

    Ich danke schon mal im Vorraus für eure Hilfe !!!

    Mit freundlichen Grüßen
  • the_old_Pirate schrieb:


    So nun zu meinen Fragen:
    1. Geht das hier überhaupt:

    Quellcode

    1. public boolean einfügen(Buch b){
    2. while(iter.hasNext()){
    3. if(iter.next() == null){


    Nein, geht nicht. Die ArrayList hat eine Funktion Add, die solltest du nehmen, oder eine eigene verkettete Liste bauen.

    the_old_Pirate schrieb:


    2. Hauptsächlich habe ich mit der Collection sucheNachAutor probleme :

    Quellcode

    1. this.autor=new ArrayList();
    2. for(Buch b: bib ){
    3. if(iter.next().autor == autor){
    4. this.autor.add(iter);
    5. return this.autor;
    6. }
    7. }return null;


    Denn hier möchte ich ja folgendermaßen vorgehen ich suche nach einem Autor durchlaufe die Liste wenn ich nun ein Buch mit dem Autor gefunden habe füge ich dieses zur Collection ArrayList hinzu so nun ist aber die Frage wie sag ich das denn ?? also wie kann ich mit dem iterator auf das Element zugreifen von dem ich gerade Festgestellt habe es hat den gleichen autor ???? hoffe man versteht die frage

    Auch hier benötigst du den Iterator nicht, mach eine for-Schleife und benutze die get(index i)-Funktion der Arraylist. Oder einfach nur das foreach und guck dann mit b.autor. Evtl musst du es von protected auf public ändern, oder Kapseln.

    the_old_Pirate schrieb:


    4. bie bestandSortiereNach habe ich gar keine Idee deshalb wäre ein lösungsansatz oder ähnliches sehr hilfreich ????

    Da gibt es sehr viele tolle Möglichkeiten, mein Favorit wäre hier ein InsertSort, da du die Liste eh duplizieren musst. Vielleicht kann man das Suchen sogar als Strategiepattern mit mehreren Suchalgorithmen implementieren.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • Danke Seba für deine Antwort!

    Allerdings komm ich immernoch nicht so recht mit der Collection zurecht:

    also habe jetzt die LinkedList in eine Arraylist geändert

    Quellcode

    1. ArrayList <Buch> bib;

    so nun habe ich auch meine einfügen ohne iterator gemacht :

    Quellcode

    1. public boolean einfügen(Buch b){
    2. for (Buch a: bib){
    3. System.out.println("hier ist die Schleife");
    4. if(bib.isEmpty()){
    5. System.out.println("Ich bin hier");
    6. bib.add(b);
    7. return true;
    8. }
    9. }return false;
    10. }
    Alles anzeigen

    so nun hab ich mal diese Ausgaben eingefügt um zu testen ob er überhaupt was tut dabei ist mir aufgefallen das er nicht mal in die foreach reinläuft blos warum ??? finde einfach den Fehler nicht
    außerdem ist mir auf gefallen das das ding mit isEmpty() auch nicht gehen kann ich bin nämlich davon ausgegangen das er die Collection durchläuft und an jedem platz schaut ob dieser voll ist wenn nicht fügt er das buch ein => also hab ich wohl die Arraylist nicht richtig verstanden ;) denn er fügt ja immer das Element an das Ende der Liste und vergrößert sie wenn nötig habe also nun das ganze zeugs weggelassen und einfach folgendes gemacht:

    Quellcode

    1. public boolean einfügen(Buch b){
    2. bib.add(b);
    3. return true;
    4. }

    nun ist nur noch die frage wieso ist in der Aufgabe vorgegeben das diese methode einfügen den rückgabewert boolean hat weil das einfügen sollte doch immer klappen oder nicht ? und auch würde mich trotzdem interessieren warum er nicht in die Schleife läuft also es ist hier nicht nötig aber ich würde es trotzdem gerne wissen ???

    auch wenn die einfügen nun funktioniert tut es die sucheNachautor noch nicht ;)
    die sieht nun folgendermaßen aus :

    Quellcode

    1. public ArrayList<Buch> sucheNachAutor(String autor){
    2. this.suche=new ArrayList();
    3. for(Buch b: bib ){
    4. System.out.println("Hier bin ich in der Schleife");
    5. if(b.autor.equals(autor)){
    6. System.out.println("jetzt bin ich auf der suche");
    7. this.suche.add(b);
    8. return this.suche;
    9. }
    10. }return null;
    11. }
    Alles anzeigen

    HIer ist schlicht und einfach das problem das er nichts findet und einfach null zurückgibt jedoch sollte er eigentlich was finden was ist hier falsch ????

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von the_old_Pirate ()

  • the_old_Pirate schrieb:


    Quellcode

    1. public boolean einfügen(Buch b){
    2. for (Buch a: bib){
    3. System.out.println("hier ist die Schleife");
    4. if(bib.isEmpty()){
    5. System.out.println("Ich bin hier");
    6. bib.add(b);
    7. return true;
    8. }
    9. }return false;
    10. }
    Alles anzeigen

    Hier kommt er wahrscheinlich nie in die foreach Schleife rein, da niemals ein Buch in die Liste eingefügt wird. Wenn eine Liste leer ist und man versucht sie per foreach Schleife zu durchlaufen passiert garnichts, da es ja kein Element gibt, was er "rausnehmen" könnte. Daher kommt er bei ner leeren Buchliste nicht in die foreach-Schleife rein. Wenn er aber nicht in die Schleife geht, wird auch nie ein Buch eingefügt, also bleibt die Liste leer. Daher ist auch die if-Abfrage if(bib.isEmpty()) widersprüchlich, da diese innerhalb der Schleife niemals true sein kann, da er sonst garnicht in die Schleife kommen würde.
    Abgesehen davon mag es Java nicht, wenn man innerhalb einer foreach-Schleife das Objekt, durch das man iteriert verändert. (also elemente entfernt/hinzufügt etc.) Die Elemente in der Liste kann man aber selbstverständlich verändern.