Eine Liste von Listen erstellen

Bitte aktiviere JavaScript!
Hallo,
Ich will eine Liste von Adressbüchern erstellen und jedes Adressbuch soll seine eigene Liste von Kontakten haben.
Bei mir ist es dann leider so, dass alle Adressbücher die selber Liste teilen. Also wenn ich ein Kontakt in ein Adressbuch einfüge landet es automatisch auch in den anderen.
Hat jemand vielleicht eine Idee wie ich das machen kann?
Ich würde mich um jede Hilfe freuen
 
Ohne, dass du auch nur eine einzige Zeile von deinem Code zeigst, kann man dir unmöglich spezifischere Hilfestellung geben.
Aktuell liest sich deine Frage als nicht viel mehr als "Mein für euch unbekannter Code funktioniert nicht. Warum?"
 
das ist meine Klasse für die Addressbücher:
Java:
public class AddressBook1 {
    public static AddressEntry head;
 
        AddressBook next;
        String name;

public AddressBook(String name,AddressEntry head, AddressBook next) {
        
          this.name = name;
          this.next = next;
          this.head = head;
}
}
Die Klasse für die Kontakte:
Code:
public class AddressEntry1{
    public String nameOfContact;

    public AddressEntry nextentry;

 
 
    public AddressEntry(String nameOfContact, AddressEntry nextentry) {
 
        this.nameOfContact = nameOfContact;
     
        this.nextentry = nextentry;
    }
}
in dieser Klasse sollen die Listen erstellt werden:
Java:
public class Erstellung1 {

    public static AddressEntry head;
    public static AddressEntry last;
    public static AddressBook headbook;
    public static AddressBook lastbook;
 
 
    public Erstellung() {
     
        this.headbook = null;
        this.lastbook = null;
    }
 
    public static String add_addressbook(String name){
         AddressEntry head = null ;
          AddressBook booknew = new AddressBook(name,head,null);
     
          if(headbook == null && name.matches("\\b[a-z]+\\b") == true) {
               headbook = booknew;
               lastbook = booknew;
          }
       
          if(name.matches("\\b[a-z]+\\b") == true) {
           booknew.next = headbook;
           headbook = booknew;
          }
             
          else {

           throw new IllegalArgumentException("Error, Name muss aus Kleinbuchstaben bestehene");
          }
          return "OK";
            }

        public static String add_contact( String name,String nameOfContact ) {
         
            AddressEntry newentry = new AddressEntry(nameOfContact,null);
                AddressEntry entry = head;
         
         
            if(nameOfContact.matches("\\b[a-z]+\\b") == true ) {
             
                if(head == null) {
                 
                    head = newentry;
                   
                } else {
                     while(entry.nextentry!=null) {
                         entry = entry.nextentry;
                       
                     }
                    entry.nextentry = newentry;
                    }}
            else {
                throw new IllegalArgumentException();
            }
         
 
            int ID = ID(name,nameOfContact);
        return String.format("%04d", ID);
        }
}
 
Das Schlüsselwort static dient dazu, eine Variable/Methode einer Klasse statt einem Objekt zuzuordnen. Diese sog. Klassenvariablen/-methoden existieren somit auch ohne ein Objekt. Beispielsweise gibt es z. B. die Variable AddressBook.head nur einmal in der ganzen Anwendung, ganz gleich, wie viele Objekte von AddressBook du auch anlegst. NB: ich gehe davon aus, dass die 1 am Ende der Klassennamen in Deinem Code ein Versehen ist.

Im Konstruktor von AddressBook überschreibst Du die Klassenvariable head (via this.head; das this ist hier etwas irreführend). Folglich teilen sich alle AddressBook-Objekte den "head" des zuletzt angelegten Objekts.

Kurz: schmeiß static überall raus (außer in der main-Methode natürlich).
 
Code:
import java.util.*;

public class MyClass {
   
    private static final List<AddressBook> ADDRESS_BOOK_LIST = new ArrayList<>(); // Erstellt eine konstante statische Liste mit Adressbüchern.
   
    public static void main( String[] args ) {
        AddressBook addressBook = new AddressBook(); // Erstellt eine neue Instanz/neues Adressbuch
        addressBook.getContactsList().add( "Kevin 01" ); // Fügt einen Kontakt hinzu
        addressBook.getContactsList().add( "Thomas 02" ); // Fügt einen Kontakt hinzu
        ADDRESS_BOOK_LIST.add( addressBook ); // Fügt die aktuelle Adressbuch in die konstante statische Liste hinzu
       
        addressBook.readAllContacts();
    }
   
}

class AddressBook {
    
    private List<String> contactsList = new ArrayList<>(); // Eine Liste in einem Adressbuch, wo alle Kontakte gespeichert werde
   
    public List<String> getContactsList() { // Getter für die Kontakte
        return contactsList;
    }
   
    public void readAllContacts() { // Gibt alle Kontakte aus
        for ( int i = 0; i < contactsList.size(); i++ ) {
            System.out.println( contactsList.get( i ) );
        }
    }
   
}
Kurz in der Pause gemacht mit einem Online Editor. Wenn du fragen hast, kannst du diese stellen.
 
  • Like
Reactions: joo
Code:
import java.util.*;

public class MyClass {
  
    private static final List<AddressBook> ADDRESS_BOOK_LIST = new ArrayList<>(); // Erstellt eine konstante statische Liste mit Adressbüchern.
  
    public static void main( String[] args ) {
        AddressBook addressBook = new AddressBook(); // Erstellt eine neue Instanz/neues Adressbuch
        addressBook.getContactsList().add( "Kevin 01" ); // Fügt einen Kontakt hinzu
        addressBook.getContactsList().add( "Thomas 02" ); // Fügt einen Kontakt hinzu
        ADDRESS_BOOK_LIST.add( addressBook ); // Fügt die aktuelle Adressbuch in die konstante statische Liste hinzu
      
        addressBook.readAllContacts();
    }
  
}

class AddressBook {
   
    private List<String> contactsList = new ArrayList<>(); // Eine Liste in einem Adressbuch, wo alle Kontakte gespeichert werde
  
    public List<String> getContactsList() { // Getter für die Kontakte
        return contactsList;
    }
  
    public void readAllContacts() { // Gibt alle Kontakte aus
        for ( int i = 0; i < contactsList.size(); i++ ) {
            System.out.println( contactsList.get( i ) );
        }
    }
  
}
Kurz in der Pause gemacht mit einem Online Editor. Wenn du fragen hast, kannst du diese stellen.

Vielen Dank Für die Antwort!
Ich habe mir den Code angeschaut , aber leider kom ich an einem Punkt nicht weiter.
Ich muss den Adressbüchern Namen geben und die Kontakte dieses Adressbuches mit dem Namen abrufen können.
Hast du vielleicht eine Idee dazu?
 
Randbemerkung: die Lösung @InDerNot verwendet keine verkettete Liste. Falls das die Anforderung ist, musst Du das lösen wie zuvor.

Wenn Du aus der Java API verwenden darfst, was Du willst, ist es einfach. Ändere List zu Map:
Java:
private static final Map<String, AddressBook> ADDRESS_BOOK_LIST = new HashMap<>();
Und füg die Adressbücher mit Namen ein:
Java:
ADDRESS_BOOK_LIST.put( "joo", addressBook );
Und greif über den Namen auf das Adressbuch zu:
Java:
ADDRESS_BOOK_LIST.get( "joo").readAllContacts();
 
Vielen Dank Für die Antwort!
Ich habe mir den Code angeschaut , aber leider kom ich an einem Punkt nicht weiter.
Ich muss den Adressbüchern Namen geben und die Kontakte dieses Adressbuches mit dem Namen abrufen können.
Hast du vielleicht eine Idee dazu?
Code:
import java.util.*;

public class MyClass {

    private static final Map<String, AddressBook> ADDRESS_BOOK_MAP = new HashMap<>(); // Erstellt eine konstante statische Map mit dem Key String und der Value AddressBook

    public static void main( String[] args ) {
        AddressBook addressBook1 = new AddressBook(); // Erstellt eine neue Instanz/neues Adressbuch
        addressBook1.getContactsList().add( "Kevin 01" ); // Fügt einen Kontakt hinzu
        addressBook1.getContactsList().add( "Thomas 02" ); // Fügt einen Kontakt hinzu

        AddressBook addressBook2 = new AddressBook();
        addressBook2.getContactsList().add( "Manuel 01" );
        addressBook2.getContactsList().add( "Max 02" );

        ADDRESS_BOOK_MAP.put( "Adressbuch-1", addressBook1 ); // Wir haben als Key einen String und ordnen die Zeichenkette einer Value zu, in dem Fall das Adressbuch.
        ADDRESS_BOOK_MAP.put( "Adressbuch-2", addressBook2 );


        for ( String entry : ADDRESS_BOOK_MAP.keySet() ) { // Eine For-Schleife, wo wir die Keys durchgehen
            System.out.println( entry ); // Alle keys ausgeben.
            /*
            Adressbuch-1
            Adressbuch-2
             */
        }

        if ( ADDRESS_BOOK_MAP.containsKey( "Adressbuch-1" ) ) { // Überprüft, ob die Map den Key Adressbuch-1 enthält
            /*
            Hinweis, diese Abfrage sollte man durchaus machen, wenn man sich nicht sicher ist, ob das Adressbuch erstellt wird oder nicht.
            Sonst arbeitest du mit null und du kriegst eine NullPointerException.
             */
            AddressBook addressBookFromMap = ADDRESS_BOOK_MAP.get( "Adressbuch-1" );
            /*
            Die Methode #get returnt die Value von dem Key. In dem Fall das Adressbuch.
             */
            addressBookFromMap.readAllContacts();
         
            /*
            Ausgabe:
            Kevin 01
            Thomas 02
             */
        }
    }

}

class AddressBook {

    private List<String> contactsList = new ArrayList<>(); // Eine Liste in einem Adressbuch, wo alle Kontakte gespeichert werde

    public List<String> getContactsList() { // Getter für die Kontakte
        return contactsList;
    }

    public void readAllContacts() { // Gibt alle Kontakte aus
        for ( int i = 0; i < contactsList.size(); i++ ) {
            System.out.println( contactsList.get( i ) );
        }
    }
}
Im Endeffekt ist es das, was @mihe7 vorgeschlagen hat. Ich fände es schöner, wenn er noch dazu eine Erklärung gepackt hätte, da man ja den Code auch verstehen sollte, aber ansonsten ist das richtig.

Wenn du eine verkettete Liste machen musst, kannst du einfach aus der ArrayList eine LinkedList machen oder dies selbst gestalten.
Eine ArrayList hat insbesondere den Vorteil, dass man schneller auf den Inhalt zugreifen kann, aber das Hinzufügen, sowie das Entfernen länger dauert.
Bei der LinkedList andersrum. Das Hinzufügen und Entfernen ist schneller, dafür dauert der Zugriff etwas länger.
Und warum das Abändern der ArrayList zu LinkedList einfach funktioniert, liegt daran, dass die Implementierungen der beiden aus demselben Interface (List) sind.
 
Code:
import java.util.*;

public class MyClass {

    private static final Map<String, AddressBook> ADDRESS_BOOK_MAP = new HashMap<>(); // Erstellt eine konstante statische Map mit dem Key String und der Value AddressBook

    public static void main( String[] args ) {
        AddressBook addressBook1 = new AddressBook(); // Erstellt eine neue Instanz/neues Adressbuch
        addressBook1.getContactsList().add( "Kevin 01" ); // Fügt einen Kontakt hinzu
        addressBook1.getContactsList().add( "Thomas 02" ); // Fügt einen Kontakt hinzu

        AddressBook addressBook2 = new AddressBook();
        addressBook2.getContactsList().add( "Manuel 01" );
        addressBook2.getContactsList().add( "Max 02" );

        ADDRESS_BOOK_MAP.put( "Adressbuch-1", addressBook1 ); // Wir haben als Key einen String und ordnen die Zeichenkette einer Value zu, in dem Fall das Adressbuch.
        ADDRESS_BOOK_MAP.put( "Adressbuch-2", addressBook2 );


        for ( String entry : ADDRESS_BOOK_MAP.keySet() ) { // Eine For-Schleife, wo wir die Keys durchgehen
            System.out.println( entry ); // Alle keys ausgeben.
            /*
            Adressbuch-1
            Adressbuch-2
             */
        }

        if ( ADDRESS_BOOK_MAP.containsKey( "Adressbuch-1" ) ) { // Überprüft, ob die Map den Key Adressbuch-1 enthält
            /*
            Hinweis, diese Abfrage sollte man durchaus machen, wenn man sich nicht sicher ist, ob das Adressbuch erstellt wird oder nicht.
            Sonst arbeitest du mit null und du kriegst eine NullPointerException.
             */
            AddressBook addressBookFromMap = ADDRESS_BOOK_MAP.get( "Adressbuch-1" );
            /*
            Die Methode #get returnt die Value von dem Key. In dem Fall das Adressbuch.
             */
            addressBookFromMap.readAllContacts();
        
            /*
            Ausgabe:
            Kevin 01
            Thomas 02
             */
        }
    }

}

class AddressBook {

    private List<String> contactsList = new ArrayList<>(); // Eine Liste in einem Adressbuch, wo alle Kontakte gespeichert werde

    public List<String> getContactsList() { // Getter für die Kontakte
        return contactsList;
    }

    public void readAllContacts() { // Gibt alle Kontakte aus
        for ( int i = 0; i < contactsList.size(); i++ ) {
            System.out.println( contactsList.get( i ) );
        }
    }
}
Im Endeffekt ist es das, was @mihe7 vorgeschlagen hat. Ich fände es schöner, wenn er noch dazu eine Erklärung gepackt hätte, da man ja den Code auch verstehen sollte, aber ansonsten ist das richtig.

Wenn du eine verkettete Liste machen musst, kannst du einfach aus der ArrayList eine LinkedList machen oder dies selbst gestalten.
Eine ArrayList hat insbesondere den Vorteil, dass man schneller auf den Inhalt zugreifen kann, aber das Hinzufügen, sowie das Entfernen länger dauert.
Bei der LinkedList andersrum. Das Hinzufügen und Entfernen ist schneller, dafür dauert der Zugriff etwas länger.
Und warum das Abändern der ArrayList zu LinkedList einfach funktioniert, liegt daran, dass die Implementierungen der beiden aus demselben Interface (List) sind.
Vieelen Dank für die Hilfe !!! Ich habe es endlich geschafft!!
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben