Hausaufgaben Verwaltungssystem

Lucienne

Mitglied
Guten Tag, geehrte!

Ich muss Hausaufgaben Verwaltungssystem programmieren, aber kann nicht damit klar kommen, woran soll ich anfangen. Also in der Aufgabe muss Klassen für Teacher, Pupil, Exersices und Lösungen implementiert werden. Aber ich habe keine Ahnung davon, wie und wo kann ich jeweils jedes neue Objekt von denen speichern, damit später möglich wäre, dass ich auf denen Prameter zugreifen könnte. Und noch dazu, Teachers haben Namen, die dürfen sich nicht wiederholen. Also ich erstelle zuerst einen neuen Lehrer, und ich kann sofort ihm einen Pupil zuweisen oder kann ich das später machen. Auf jeden Fall, damit ich einen Pupil einem Lehrer zuweisen kann, muss ich gewünschten Lehrer zuerst aktivieren. Verstehe hier auch nicht, was damit gemeint würde.

Wenn jemand mir helfen könnte, würde ich mich sehr freuen.
Danke.
 
K

kneitzel

Gast
Also wie bei allen Entwicklungsprojekten:
a) Verstehen, was da überhaupt gemacht werden soll. Dazu gehört also das genaue Verständnis der einzelnen Teile und wie diese miteinander agieren. (Hier kannst du also ganz Umgangssprachlich bleiben.)
b) Wenn Du das verstanden hast, dann kannst Du da etwas abstrahieren und ein Model schaffen. Da schaffst Du Dir dann eine genaue Übersicht, was für Klassen Du brauchst, was die enthalten und wie diese mit anderen Klassen interagieren können.
c) Dann kannst Du dein Model implementieren und testen.

Also versuch erst einmal zu verstehen, um was es da genau geht. Rein Umgangssprachlich....
 

Lucienne

Mitglied
Danke! Aber ich habe bisschen anderes gemeint. Also, ich erstelle mehrere Teachers, wo und wie kann ich die spechern? Z.b. Teachers haben die Namen die sich nicht wiederholen dürfen. Ich möchte denn alle Teachers in HashSet speichern.
Dann habe ich Klasse "Teacher" erstellt und damit ihn in HashSet speichern zu können, habe folgendes geschrieben: teachers.add(new Teacher("Jimmy")), ich habe bei der Klasse Teacher nur Konstruktor mit Teacher's Name. Aber funktioniert es irgendwie nicht.
 
K

kneitzel

Gast
Also du fragst, wie Du die Instanzen der Klasse Teacher speichern kannst und gibst dann selbst die Antwort: z.B. in einem HashSet.

Wieso der Code, den Du geschrieben hast, nicht funktioniert, können wir Dir ohne Details nicht sagen. Wenn Du uns zum einen den Code (in Code-Tags!) sowie die genaue Fehlermeldung / Exception Details gibst, können wir in dem Punkt auch weiter helfen....
 

Lucienne

Mitglied
Java:
public class Main {
    public static void main(String[] args) {
        boolean quit = false;
        String inputString = "";
        String twoTeils[];
        HashSet<Teacher> teachers = new HashSet<Teacher>();
        while (!quit) {
            inputString = Terminal.readLine();
            if (inputString.equals("quit")) {
                quit = true;
            } else if (inputString.contains("put [a-z]+")) {
                twoTeils = inputString.split(" ");
                teachers.add(new Teacher(twoTeils[1]));
            } else if (inputString.equals("get")) {
                Terminal.printLine(teachers);
            }

Und Ausgabe hier ist: [ ]. Warum?
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Also contains nimmt keine regulären Ausdruck. Und du wirst ja nicht put [a-z]+ eingegeben haben....

Und Code immer in Code-Tags. Dein Terminal selbst kenne ich nicht, daher habe ich mal eine compilierbare Version gebaut.
Java:
import java.util.HashSet;
import java.util.Scanner;

public class Teacher {
    public Teacher(String name) {}
    
    public static void main(String[] args) {
        boolean quit = false;
        Scanner terminal = new Scanner(System.in);
        
        String inputString = "";
        String twoTeils[];
        HashSet<Teacher> teachers = new HashSet<Teacher>();
        while (!quit) {
            inputString = terminal.nextLine();
            if (inputString.equals("quit")) {
                quit = true;
            } else if (inputString.matches("^put [a-z]+$")) {
                twoTeils = inputString.split(" ");
                teachers.add(new Teacher(twoTeils[1]));
            } else if (inputString.equals("get")) {
                System.out.println(teachers);
            } else {
                System.out.println("Unrecognized command!");
            }
        }
        terminal.close();
    }   
}
 
K

kneitzel

Gast
Der Code von mir macht natürlich noch keinen Sinn. Die Main habe ich nur zu Teacher umbenannt um da direkt den Konstruktor mit String Parameter zu bekommen ...

Und ich habe natürlich noch ein letztes else hinzugefügt - das zeigt dann, wenn eine Eingabe nicht verstanden wurde!

Ansonsten bitte die Klassen, die man nutzt, anschauen. Dokumentation der String Klasse für contains und matches Aufrufe und so:
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
 

Lucienne

Mitglied
Der Code von mir macht natürlich noch keinen Sinn. Die Main habe ich nur zu Teacher umbenannt um da direkt den Konstruktor mit String Parameter zu bekommen ...

Und ich habe natürlich noch ein letztes else hinzugefügt - das zeigt dann, wenn eine Eingabe nicht verstanden wurde!

Ansonsten bitte die Klassen, die man nutzt, anschauen. Dokumentation der String Klasse für contains und matches Aufrufe und so:
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html
Danke sehr. Jetzt ist die Ausgabe aber "[Teacher@edf4efb, Teacher@35f983a6]", nachdem ich habe zwei Lehrer erstellt. Wie kann ich denen Namen und Attributen zugreifen? Warum bei der Ausgabe sieht man keine Namen? Im Aufgabe steht, dass man zuerst einen Lehrer aktivieren müssen, damit ihm einen Pupil zuweisen zu können. Was bedeutet das? Ist das im Prinzip richtig, Objekte in Liste zu speichern, oder macht man es richtig irgendwie anders?
 

Lucienne

Mitglied
Und noch eine Frage. HashSets speichern gleiche Objekte nur einmal, meine Teachers unterscheiden sich durch den Namen. Ich habe zweimal Befehl "put" benutzt mit gleichem Namen, aber trotz sieht man, das wurde zwei Objekte Teacher erstellt.
 
K

kneitzel

Gast
Java Grundlagen:
Wenn Du in einer Klasse nicht:
- die toString Funktion überschreibst, dann ist die Ausgabe immer <Klassenname>@<Referenz>
- die equals Funktion überschreibst, dann sind zwei Instanzen nur dann gleich, wenn die Referenzen gleich sind. (Somit sind zwei Teacher instanzen unterschiedlich, siehst Du ja an der Ausgabe: Die Referenz ist ja unterschiedlich.)
- Wenn man equals überschreibt, sollte man auch hashCode() überschreiben. Vorgabe: Wenn zwei Instanzen gleich sind, muss auch der Hashcode gleich sein!
- Was das "Aktivieren" angeht: Das könnte eine Begrifflichkeit aus der Problemdömäne sein. Soll ein Lehrer Aktiv / Deaktiv sein können oder so? Da ich die Aufgabe nicht kenne, kann ich dazu nichts sagen.
 

Lucienne

Mitglied
Also, in Aufgabe ist so geschrieben:
Befehl "teacher <name>" legt einen neuen Lehrer mit Namen <name> an und wählt diesen aus. Falls ein Lehrer mit diesem Namen bereits existiert, dann wird dieser ausgewählt und kein neuer Lehrer angelegt.
Der pupil-Befehl legt einen neuen Schüler mit Namen <name> und Personnenkennzeichen <pupilId> an. Der Schüler wird dem zuletzt ausgewählten Lehrer zugewiesen.

Deswegen, habe ich für Speicherung Teachers-Objekte HashMap gewählt und für Pupils-Objekte - HashMap. Bin ich auf dem richtigen Weg? Und hier ist nicht verständlich, was bedeutet "wird dieser Lehrer ausgewählt"?

Danke sehr für Ihre Hilfe, ich lese schon genauer, was Sie mir geschrieben und empfohlen haben. Sie haben mir wirklich sehr geholfen.
 
K

kneitzel

Gast
Es bedeutet, dass es einen ausgewählten Lehrer gibt. Also z.B. eine entsprechende Variable.

Und was für eine Map hast Du jetzt für die Lehrer gebaut? Eine Map, wo der Name des Lehrers als Key genommen wird? Das ist natürlich denkbar - erspart die Punkte, die ich oben geschrieben habe zu der Teacher Klasse bezüglich equals und hashcode.
 

Lucienne

Mitglied
Es bedeutet, dass es einen ausgewählten Lehrer gibt. Also z.B. eine entsprechende Variable.

Und was für eine Map hast Du jetzt für die Lehrer gebaut? Eine Map, wo der Name des Lehrers als Key genommen wird? Das ist natürlich denkbar - erspart die Punkte, die ich oben geschrieben habe zu der Teacher Klasse bezüglich equals und hashcode.

Entschuldigung. Ich habe gemeint, für Speicherung von Lehrer möchte ich HashSet benutzen, und für die Schülern - HashMap, weil Pupils haben sowohl Name, als auch Nummer.
 
K

kneitzel

Gast
Was genau speicherst Du wo?
HashMap bei Lehrer kann ok sein, weil du die Lehrerinstanz finden willst über den Namen. Daher kann eine Map mit Name, Teacher eine gute Lösung sein.

Wenn ein Schüler mehrere Attribute hat, dann solltest du aber das nur in die Klasse packen. Solange du da nicht gezielt etwas finden musst, ist eine Map nicht notwendig. Map ist ja immer für den schnellen Zugriff gedacht, also wenn du von einem Key zu der Instanz willst. Also etwas vergleichbar mit einem Index bei SQL. Wenn man die Lehrer in einem schnellen Zugriff bräuchte mit zwei verschiedenen Attributen, dann könnte man auch zwei Maps haben.

Von dem, was ich jetzt so gelesen habe, dürfte bei den Schülern eine Set reichen.

(Bei einer Set kann man ja auch die Elemente durchgehen um ein Element zu finden ... eine Map ist nur eine Optimierung, weil die Komplexität von O(n) auf O(log(n)) zurück geht weil ein Suchbaum im Hintergrund verwendet werden kann. (Ich kenne die genauen Implementierungen nicht, daher ist das mit dem O(n) undO(log(n)) eine Vermutung) ... Gerade bei kleinen Datenmengen ist aber nur die einfache Suche interessant. Man kann das get(key) nutzen statt selbst eine kleine Funkiton mit einer for each Schleife zu schreiben...

PS: hoffe es war halbwegs verständlich ... bin nur am Tablet und hab heute Abend schon etwas getrunken ...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben