# elektronische Kartei



## brilzi89 (6. Aug 2021)

Hallo zusammen. Ich habe von der Schule eine Aufgabe bekommen an der ich mich jetzt seit 3 Tagen beschäftige, aber immer noch nicht weiterkomme.

Kurz die Aufgabenstellung.

Erstellen einer elektronischen Kartei für Freunde
Entwickeln sie eine Klasse Kartei, eine Klasse Freund und eine Klasse Adresse.
In der Klasse Kartei sollen die Freunde verwaltet werden. Es sollen Methoden zum Hinzufügen, zum Ändern, zum Löschen von Freunde geben. Auch möchte man nach Freunde in der Kartei suchen können (z.B. nach dem Nachnamen oder dem Schlüssel) und die Gesamtanzahl der Freunde, die gespeichert sind, ausgeben können. Berücksichtigen Sie auch mögliche Fehler, die auftreten können.
In der Klasse Freund werden die Vornamen, Nachname, Geburtsdatum und Adressen der Freunde gespeichert. Außerdem benötigen Sie noch eine Variable, welche jedes Objekt „Freund“ eindeutig identifiziert (Schlüssel). Es gibt Methoden zum Anlegen von neuen Freunden, sowie zum Auslesen und zu den Änderungen einzelner wesentlicher Attribute. Außerdem sollen die Freunde auch mehrere Adressen haben können. Stellen Sie für diese Problemstellung nur die wichtigen Methoden zum Auslesen und Ändern der Attribute zur Verfügung. Berücksichtigen Sie auch mögliche Fehler, die auftreten können.
In der Klasse Adresse werden die Adressen wie PLZ, Ort und Strasse verwaltet. Stellen Sie für diese Problemstellung nur die wichtigen Methoden zum Auslesen und Ändern der Attribute zur Verfügung. Berücksichtigen Sie auch mögliche Fehler, die auftreten können.
In einem Mainprogramm sollen dann beispielhaft verschiedene Freunde mit ihren möglichen Adressen eingegeben und in der Kartei angelegt werden. Man soll auch das Löschen eines Eintrags und eine Änderung an einem Eintrag beispielhaft vornehmen. Am Schluss soll eine Adressliste aller Freunde erstellt und ausgegeben werden.


Ich habe nun 3 Klassen erstellt mit den Namen Freund, Adresse und Kartei. In den Klassen Freund und Adresse habe ich Instanzvariablen (z.B. String vorname) sowie Konstruktoren und getter und setter Methoden angelegt. Jetzt habe ich seit paar Tagen einen Blackout, da ich nicht weiß wie ich die ganzen Daten speichern soll. Kann mir da einer weiterhelfen. Sollte ich alles in ein Array speichern oder doch in eine XML Datei?


----------



## Robert Zenz (6. Aug 2021)

brilzi89 hat gesagt.:


> Sollte ich alles in ein Array speichern oder doch in eine XML Datei?


Gar nicht, wenn ich die Aufgabe richtig lese. Also im Text wird das Wort "speichern" so verwendet dass es halt heiszt dass die Daten gehalten werden muessen, nicht dass diese auf irgendeine Art und Weise persistiert werden muessen ueber das Programmleben hinaus.



brilzi89 hat gesagt.:


> Ich habe nun 3 Klassen erstellt mit den Namen Freund, Adresse und Kartei. In den Klassen Freund und Adresse habe ich Instanzvariablen (z.B. String vorname) sowie Konstruktoren und getter und setter Methoden angelegt.


Perfekt, und so geht es weiter. Wenn du mehrere Freunde oder Adressen hast, verwendest du einfache eine java.util.List. Also so verkettet quasi:


```
public class Kartei
    private List<Freund> freunde = new ArrayList<>();

public class Freund
    private List<Adresse> adressen = new ArrayList<>();

public class Adresse
```

Dann noch die gefordereten add/remove Methoden hinzufuegen, und du bist schon fast fertig. Das aufwendisgte wird die Benutzerinteraktion sein zum eingeben der Daten (ist es immer, die Idee dass du "mal eben so" eine UI (egal ob CLI, TUI oder GUI) schreibst kannst du dir gleich abschminken).


----------



## brilzi89 (6. Aug 2021)

Erstmal vielen Dank für die schnelle Antwort 
Das mit der ArrayList habe ich schon versucht. Allerdings habe ich nichts Hilfreiches im Internet gefunden, wie ich diese Listen verknüpfen kann, um eine Adresse dem richtigen Freund zuzuweisen. Könntest du mir da noch ein Tipp geben, wie ich das umsetzen kann.


----------



## Robert Zenz (6. Aug 2021)

Du erstellst eine neue Adresse, befuellst diese, und setzt diese dann dem Freund. Etwas Pseudo-Code basierend auf meinem vorherigen Beispiel:


```
Adresse adresse = new Adresse();
// Befuellen
freund.addAdresse(adresse);

// ---

public void addAdresse(Adresse adresse) {
    adressen.add(adresse);
}
```


----------



## javaNoob1337 (22. Aug 2021)

Könntet ihr das noch einmal zusammenhängend schreiben? Ich stehe leider etwas auf dem Schlauch. Wo erstelle ich die neue Adresse ? In der Freund Klasse oder ist das noch alles in der Adresse Klasse?


----------



## temi (22. Aug 2021)

javaNoob1337 hat gesagt.:


> Könntet ihr das noch einmal zusammenhängend schreiben? Ich stehe leider etwas auf dem Schlauch. Wo erstelle ich die neue Adresse ? In der Freund Klasse oder ist das noch alles in der Adresse Klasse?


Eher, weder noch. Du hast drei Klassen Kartei, Freund und Adresse und irgend eine andere Klasse (mit der main()-Methode), die diese drei Klassen verwendet (das Mainprogramm). Dort werden Kartei, Freunde und Adressen erstellt und verwaltet. Steht auch so im Text:


brilzi89 hat gesagt.:


> In einem Mainprogramm sollen dann beispielhaft verschiedene Freunde mit ihren möglichen Adressen eingegeben und in der Kartei angelegt werden.


----------



## janice_ (Dienstag um 20:15)

Hallo zusammen,
Ich habe eine ähnlich Fragestellung, wie oben beschrieben. In meiner Klasse Kartei habe ich die Methoden addFreund, removeFreund und getAnzahlFreunde. Die Methoden freundHinzufuegen, freundLoeschen, freundSuchen habe ich jetzt aber in meiner Main Klasse implementiert. Mein Programm funktioniert zwar so, ich bin mir jedoch nicht sicher, ob das hinsichtlich objektorientiertem Programmieren so richtig ist oder ob diese Methoden auch in die Klasse Kartei gehören.
Wie würdet ihr das sehen?


----------



## Robert Zenz (Dienstag um 20:29)

Jein...das kommt darauf an was du in den Methoden genau tust und wie du die Sache eigentlich strukturieren willst.


----------



## janice_ (Dienstag um 21:21)

Erstmal vielen Dank für die schnelle Rückmeldung! 
Ich habe die ArrayListen so implementiert, wie du oben geschrieben hattest. In die Adressliste werden dann die Adresse ggf. Adressen eingefügt mittels add(adresse[]) und in die ArrayListe Kartei dann die Freunde mit add(freund[]). Im Main Programm deklariere ich dann Kartei , Freunde und Adressen:

```
private Adresse[] adresse = new Adresse [10];
private Freund [] freund = new Freund [50];
private Kartei [] kartei = new Kartei [1];
```

Der User steuert das Programm über Konsoleneingaben. Man kann über eine Auswahl dann die verschiedenen Aktionen auswählen und da sind dann die Methoden hinterlegt z.B. freundLoeschen. Die Methode freundLoeschen habe ich dann in der Main Klasse. Man wird nach der ID des Freundes gefragt, die Eingabe wird dann gespeichert und mittels for-Schleife werden alle Freunde durchgegangen, wenn if (schluessel == eingabe) dann wird die remove Methode aus der Klasse Kartei ausgeführt und der Freund so aus der ArrayListe Freunde gelöscht. Ähnlich habe ich auch die anderen Methoden in der Main Klasse aufgebaut. 

Ich bin nur etwas irritiert, weil es laut Aufgabenstellung in der Klasse Kartei Methoden zum Hinzufügen, zum Ändern, zum Löschen von Freunde sein sollen. Ich hatte es jetzt so interpretiert, dass z.B. die removeFreund Methode in Klasse Kartei, die zum Löschen ist. Die Methode zum spezifischen Löschen nach ID habe ich dann in der Main Klasse, weil ich da auch erst die Freunde erstelle.


----------



## KonradN (Dienstag um 21:27)

Du sollst da auch nicht die Arrays so erstellen. Wie sehen denn die Klassen bei Dir aus? Denn die Klassen sollen sich ja gegenseitig nutzen.

Wenn Du ein Auto hast, dann hat das Auto Sitze und einen Motor. Und der Motor hat Kolben.

Wenn du Dir 3 Autos kaufst: bekommst du dann einen Haufen Karosserien (ohne Motoren und Sitze), einen Haufen Motoren (ohne Kolben), einen Haufen Sitze und natürlich noch ein Haufen Kolben?

Das wurde doch zusammen gesetzt. Jedes Auto hat die Sitze und den Motor, die es braucht. Und jeder Motor hat die Kolben, die er braucht.

So ist es auch hier. Ein Freund hat mehrere Adressen … dann sind die im Freund … und die Freunde sind in einer Kartei.


----------



## janice_ (Dienstag um 21:52)

Stimmt das ergibt Sinn! Ich habe in den Klassen Freund und Kartei jeweils einen Konstruktor und die getter und setter Methoden für die jeweiligen Attribute Name, Vorname, Geburtstag etz. bzw. PLZ, Ort, Straße. 

Müsste ich dann im Konstruktor von Freund schon die Arrays für Adresse erstellen? und im Konstruktor von Kartei dann die von Freund? 
Also z.B. so bei Klasse Freund:

```
public class Freund
{
    
    private static int count = 0;
    private int ID ;
    private String name;     
    private String vorname; 
    private String geburtsdatum; 
    private Adressse [] adresse;
    private ArrayList<Adresse> adressliste = new ArrayList<Adresse>();
    
    
    
    public Freund (Scanner eingabe)
    {
        this.ID = count++;
        System.out.print ("Vorname: ");
        vorname = eingabe.nextLine();
        System.out.print ("Nachname: ");
        name = eingabe.nextLine();
        System.out.print ("Geburtstag: ");
        geburtsdatum = eingabe.nextLine();
        adresse = new Adresse [100]
    }
```


----------



## KonradN (Dienstag um 22:06)

Das kommt dem Ganzen schon etwas näher. Zwei Dinge fallen da auf:

a) wo und wie willst due die Adressen speichern? Du hast da jetzt zwei Instanzvariablen: einmal das Array und einmal die ArrayList. Brauchst du beide?

b) bei so Klassen spricht man oft von Datenklassen. Da sind also meist nur die Daten drin. Logik wie Dinge abfragen und so sind unüblich (und kommen dann eher nicht in den Konstruktor). Daher sollte so ein Konstruktor nur entgegen nehmen, was an Daten notwendig ist zur Erzeugung des Datensatzes. Das kann dann etwas sein wie z.B. der Name. Ein Freund ohne Name gibt es nicht.

Die Eingabe von Werten ist dann da nicht. Das ist eine eigene Methode. Die fragt dann alles ab und erstellt den Freund und gibt ihn zurück.

Die Methode kommt üblicher Weise in eine Klasse, die so UI Dinge in sich hat. Aber prinzipiell könnte sie auch in Freund sein (technisch geht das, aber UI trennt man gerne von den Daten).


----------



## janice_ (Dienstag um 22:16)

a)Ich dachte ich bräuchte beide, damit ein Freund mehrere Adressen haben kann. Aber wahrscheinlich brauche ich dann dafür nur die Liste? 

b)Auch das macht Sinn, werde ich anpassen 

Vielen Dank für die Rückmeldung!! 🙂


----------



## KonradN (Dienstag um 22:51)

janice_ hat gesagt.:


> Ich dachte ich bräuchte beide, damit ein Freund mehrere Adressen haben kann. Aber wahrscheinlich brauche ich dann dafür nur die Liste?


Eins von beidem reicht Dir. In dem Array kannst Du mehrere Adressen speichern. Das Gleiche gilt für die ArrayList (Die hat intern auch nur ein Array - bietet nach außen aber die Zugriffsmöglichkeiten einer List. Daher der Name: ArrayList).

Wenn Du die ArrayList nutzen darfst, dann vereinfacht diese Dir alles. Beim Array musst Du etwas mehr Code selbst schreiben.


----------

