Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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?"
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).
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.
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?
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?
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.
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.