PhoneBook mit verketteten listen

Diskutiere PhoneBook mit verketteten listen im Java Basics - Anfänger-Themen Bereich.
A

arhzz

Hallo!

Ich muss ein Programm erstellen der einen PhoneBook "simulieren soll".Nämlich soll ich ein interface implementieren der methoden enthält und diese methoden sollen folgendes machen. Lookup sollte eine Person suchen und wen der Name gleich ist soll es das Person objekt züruckliefern. Die methode Insert und Delete sind e schön klar.Ich habe versucht alles zu implementieren aber es klappt nicht so gut.

Java:
class PhoneBookList implements PhoneBook {
    private int size = 0;
    Node head = null;
    
    public Person lookup(String name) {
        Node p = head;
        int pos = 0;
        
        while( p!=null) {
            int comparison = p.compareTo(name);
            
        if(comparison == 0)
            return person;
        else Out.println("Person does not exist");
            return false;
        }
    }
    
    public boolean insert(Person person) {
        Node p = head;
        Node prev = null;
        
        while( p!=null) {
        
        Node n = new Node(person);
        n.next = p;
        
        if(prev == null) {
            head = n;
        }else{
            prev.next = n;
      }
        size++;
    }
  }
    public boolean delete(String name) {
        Node p = head;
        Node prev = null;
        
        while( p!=null) {
            prev = p;
            p = p.next;
            int comparison = p.compareTo(name);
            
        if(comparison == 0) {
            prev.next = p.next;
            return true;
        }else {
            Out.println("The person does not exist");
            return false;
        }
        size--;
    }
}   
    public int size() {
        Out.println(size);
    }
    
    static final class Node {
        final Person person;
        Node next;
        
        Node(Person person) {
            this.person = person;
            
        }
    }
    @Override
  public String toString() {
    return String.format("%-10s, %-20s, %-10s", name, address, phoneNr);
  }       

}
Wir sollen auch diese compareTo methode verwenden,aber ich bin mir nicht sicher wie dass gehen soll, und ich habe auch eine Klasse Person;

Java:
class Person {

  final String name;
  final String address;
  final String phoneNr;

  Person(String name, String address, String phoneNr) {
    this.name = name;
    this.address = address;
    this.phoneNr = phoneNr;
  }

  @Override
  public String toString() {
    return String.format("%-10s, %-20s, %-10s", name, address, phoneNr);
  }

}
Ein bisschen hilfe wäre gut, Danke!
 
J

JustNobody

Spiel deinen Algorithmus doch einmal durch! Also Stift und Zettel nehmen und von Hand alles machen ...

In der while schleife prüft du das erste Element. Ist es nicht das gesuchte, dann gibt es das Element nicht?
Und nach dem else hast du zwei Befehlee, da fehlen die geschweiften Klammern!

Delete fällt direkt auf, dass dein size-- nie erreicht werden kann ...

Also ggf. Willst du erst einmal in Worten erläutern, wie du in der Liste ein Element finden kannst ... generell Unterteil Probleme. Das könnte so aussehen:
- zu gesuchtem Element gehen
- Ergebnis zurück geben.
 
A

arhzz

Spiel deinen Algorithmus doch einmal durch! Also Stift und Zettel nehmen und von Hand alles machen ...

In der while schleife prüft du das erste Element. Ist es nicht das gesuchte, dann gibt es das Element nicht?
Und nach dem else hast du zwei Befehlee, da fehlen die geschweiften Klammern!

Delete fällt direkt auf, dass dein size-- nie erreicht werden kann ...

Also ggf. Willst du erst einmal in Worten erläutern, wie du in der Liste ein Element finden kannst ... generell Unterteil Probleme. Das könnte so aussehen:
- zu gesuchtem Element gehen
- Ergebnis zurück geben.
Ok,ich sehe was ich machen kann.
 
T

temi

Es ist auch geschickt, wenn du dir nicht mehrere Probleme gleichzeitig antust. Fang mit einer Methode an und teste sie mit dem Debugger (oder mit Hilfsausgaben), bis sie korrekt funktioniert. Danach mach mit der nächsten weiter, usw.

Also: insert() -> size() -> delete() -> lookup()
 
MoxxiManagarm

MoxxiManagarm

Wir sollen auch diese compareTo methode verwenden,aber ich bin mir nicht sicher wie dass gehen soll,
Deine Klasse Person sollte das Interface Comparable<Person> implementieren. Die Methode gibt 0 zurück, wenn beide Objekte gleich sind.
 
Zuletzt bearbeitet:
A

arhzz

Deine Klasse Person sollte das Interface Comparable<Person> implementieren. Die Methode gibt 0 zurück, wenn beide Objekte gleich sind.
Also in der Angabe steht so; "Verwenden Sie die Methode int compareTo(String other) der Klasse String für den Vergleich von Personennamen. Diese Methode liefert 0, wenn ein String gleich other ist, einen negativen Wert, wenn ein String lexikographisch vor other steht, und einen positiven Wert, wenn ein String lexikographisch nach other steht", dass mit dem Interface Comparble ist mir bekannt, wir haben diesen interface schon benutzt
 
MoxxiManagarm

MoxxiManagarm

Das widerspricht sich nicht

Java:
class Person implements Comparable<Person> {
  private String name;
  // ...

  @Override
  public int compareTo(Person other) {
    return this.name.compareTo(other.name);
  }
}


Aber ich war trotzdem gedanklich irgendwie daneben, du sollst ja nach dem Namen suchen und nicht sortieren oder sowas... Aber ehrlich gesagt ergbt sich mir nicht der Sinn, warum ihr dann compareTo anwenden sollt anstatt einfach equals \o/
 
Zuletzt bearbeitet:
A

arhzz

Das widerspricht sich nicht

Java:
class Person implements Comparable<Person> {
  private String name;
  // ...

  @Override
  public int compareTo(Person other) {
    return this.name.compareTo(other.name);
  }
}


Aber ich war trotzdem gedanklich irgendwie daneben, du sollst ja nach dem Namen suchen und nicht sortieren oder sowas...
Ja ich sollte nach dem namen suchen.Und das Person objekt züruckliefern.
 
MoxxiManagarm

MoxxiManagarm

Du brauchst auf jeden Fall dann einen getter für den Namen in Person und ein gett für Person in Node
 
Zuletzt bearbeitet:
MoxxiManagarm

MoxxiManagarm

Hmmm okay, also ich werde mit meinem Professor überprüfen ob ich die Klasse Person anpassen muss.
Ne musst du nicht, ich sehe gerade dass dein Prof das Geheimnisprinzip in der Übung nicht einhält. Damit hatte ich irgendwie nicht gerechnet. Es reicht, wenn du einfach mit . direkt auf das Feld zugreifst. Wird Zeit für Wochenende.
 
A

arhzz

Ne musst du nicht, ich sehe gerade dass dein Prof das Geheimnisprinzip in der Übung nicht einhält. Damit hatte ich irgendwie nicht gerechnet. Es reicht, wenn du einfach mit . direkt auf das Feld zugreifst. Wird Zeit für Wochenende.
Ok also mit . direkt zugreifen. Ich probiere in Paar dinge und wir sehen was passiert. Danke!
 
A

arhzz

Okay,also ich habe eine neu Strategie versucht um mein Problem zu lösen.Nämlich habe ich den Rat von einen von euch befolgt den Code zu Unterteilne.Logischer weisse soll ich zuerst die insert methode Implementieren, und dass habe ich versucht.Ich habe auch ein bisschen über die compareTo methode gelesen und ich denke ich weiss wie ich sie verwenden soll.Aber jetzt bin ich nicht sicher wie ich sich dass alles mit boolean machen soll.Boolean sollte doch immer 2 ruckwerte haben true und false,und ich denke dass ich den wert true richtig Implementiere aber wie ich false züruck geben soll,wenn die Namen gleich sind.Vielleicht noch ein Paar Tipps? Danke!


Java:
class PhoneBookList implements PhoneBook {
    private int size = 0;
    Node head = null;
    
    private static final class Node {
        final Person person;
        Node next;
        
        Node(Person person) {
            this.person = person;
        }
    }
    
    public boolean insert(Person person) {
        Node p = head, prev = null;
        
        while(p!=null) {
            int comparison = person.name.compareTo(person.name);
            
          if(comparison != 0) {
            size++;
            return true;
         }
            if(comparison == 0) {
            prev = p;
            p = p.next;
          }
      }
    
    Node n = new Node(person);
      if (prev == null){
          head = n;
      }
      else{
          prev.next = n;
          n.next = p;
      }
    }
}
 
MoxxiManagarm

MoxxiManagarm

Was hat der insert mit compareTo zu tun? Soll die Liste sortiert sein? Macht für ein Telefonbuch ja Sinn, aber erwähnt hast du das noch nicht
 
MoxxiManagarm

MoxxiManagarm

Du vergleichst hier z.B. die Person mit sich selbst: person.name.compareTo(person.name). Beim Einfügen musst du mit -1 und 1 arbeiten, du willst die Person ja zwischen einer "kleineren" und einer "größeren" Person einfügen
 
J

JustNobody

Also ich würde dir raten erst einmal den Algorithmus in Worte zu fassen, damit die Hürde der Programmiersprache entfällt.

Deine while Schleife geht so lange weiter, wie der Vergleich 0 (Elemente sind gleich, wobei du noch nicht das aktuelle Element mit dem einzufügenden vergleichst) ergibt. So die Elemente nicht gleich sind, fügst du das Element ein (ok, das Einfügen fehlt noch, aber du setzt size hoch...)

Das ist aber doch nicht das, was du machen willst nehme ich an...
 
A

arhzz

Du vergleichst hier z.B. die Person mit sich selbst: person.name.compareTo(person.name). Beim Einfügen musst du mit -1 und 1 arbeiten, du willst die Person ja zwischen einer "kleineren" und einer "größeren" Person einfügen
Hmmm ja dass sehe ich jetzt auch,also wie könnte dass ausshen? Onde das person in den Klammern?
 
J

JustNobody

Du hast den Node p - da steckt doch auch ein Name drin. Vergleich den doch mit der übergebenen Person.
 
MoxxiManagarm

MoxxiManagarm

Bei Verketteten Listen stell dir auch immer gerne die ganze Sache bildlich vor. Nehmen wir einen Zug. Deine PhoneBookList ist das Führerhaus. Dieses Führerhaus kennt nur den ersten Waggon, also der, der an dieses Führerhaus gekoppelt ist (bei dir head). Jeder Waggon hat eine numerischen Wert (bei dir Person) und kennt wiederum den nächsten angekoppelten Waggon (next). Außerdem hast du einen Bahnmitarbeiter, er weiß stets vor welchem Waggon er steht. Nennen wir diesen einmal current. Der Bahnmitarbeiter fängt immer am Führerhaus an, wenn er etwas mit diesen aneinandergekoppelten Waggons tun soll.

Nehmen wir nun also das Beispiel Einfügen. current ist noch null, weil der Bahnmitarbeiter vor dem Führerhaus steht. Außerdem steht ein Waggon (new Node) auf einem anderen Gleis, der numerisch sortiert reingekoppelt werden soll. Der Bahnmitarbeiter geht zum ersten Waggon und schaut sich diesen an und schreitet so Waggon bis Waggon vor (current verändert sich), bis er zwischen einem Waggon mit niedrigerer Nummer und einem Waggon mit höherer Nummer steht. Diese 2 Waggons entkoppelt der Bahnmitarbeiter und koppelt diese stattdessen mit dem Waggon auf dem anderen Gleis. Es sind also 2 Kupplungen zu verändern.

Vielleicht hast du ja auch irgendwo Spielzeug o.Ä. rumliegen, mit welchem du das auf dem Tisch nachspielen kannst.
 
Thema: 

PhoneBook mit verketteten listen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben