Hashset

Ich hab ein paar Fragen zu einem Übungsbeispiel, Ich muss ein Hashset implementieren und dieses alphabetisch nach dem Nachnamen von Studenten ausgeben, zusätzlich soll ich einen neuen Studenten anlegen, nach bestimmten Studenten suchen (durch Nummer oder Name) und bestimmte Studenten löschen können. Irgendwie komm ich nicht weiter hätte jemand Lösungsvorschläge?
Java:
class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Set<Student> studi = new HashSet<>();

        studi.add(new Student(1, "Mustermann", "Max", "m"));
        studi.add(new Student(2, "Müller", "Bernd", "m"));
        studi.add(new Student(3, "Bauer", "Franz", "m"));

        Iterator<Student> it = studi.iterator();

        int input;

        while (it.hasNext()) {

            System.out.println("Wählen Sie zwischen 1-4");
            System.out.println("1 = Student anlegen");
            System.out.println("2 = Student suchen");
            System.out.println("3 = Student löschen");
            System.out.println("4 = Liste ausgeben");
            System.out.println("5 = Beenden");

            input = sc.nextInt();
            switch (input) {
                case 1:

                    System.out.println("Geben Sie die Daten des Studenten ein");
                    System.out.println("Geben Sie die Matrikelnummer an!");
                    int MatrNr = sc.nextInt();
                    System.out.println("Geben Sie ihren Nachnamen an!");
                    String Nachname = sc.next();
                    System.out.println("Geben Sie ihren Vornamen an!");
                    String Vorname = sc.next();
                    System.out.println("Geben Sie das Geschlecht an");
                    String Geschlecht = sc.next();
                    System.out.println("Student wurde angelegt!");
                    Student student = new Student(MatrNr, Nachname, Vorname, Geschlecht);
                    studi.add(student);
                    System.out.println(student);

                    break;

                case 2:

                    break;
                case 3:

                    break;

                case 4:
                    for (Student studenten : studi) {
                        System.out.println(it.next());
                    }
                    break;
                case 5:
                    System.out.println("Programm wurde beendet!");
                    System.exit(0);
                    break;

            }

        }

    }
}
Code:
class Student {

    int MatrNr;
    String Vorname;
    String Nachname;
    String Geschlecht;

    public Student(int MatrNr, String Nachname, String Vorname, String Geschlecht) {
        this.MatrNr = MatrNr;
        this.Vorname = Vorname;
        this.Nachname = Nachname;
        this.Geschlecht = Geschlecht;
    }

    public int getMatrNr() {
        return MatrNr;

    }

    public String getVorname() {
        return Vorname;

    }

    public String getNachname() {
        return Nachname;

    }

    public String getGeschlecht() {
        return Geschlecht;

    }

    public void setMatrNr(int MatrNr) {
        this.MatrNr = MatrNr;

    }

    public void SetVorname(String Vorname) {
        this.Vorname = Vorname;

    }

    public void SetNachname(String Nachname) {
        this.Nachname = Nachname;

    }

    public void SetGeschlecht(String Geschlecht) {
        this.Geschlecht = Geschlecht;

    }

    @Override
    public String toString() {
        return "MatrNr = " + MatrNr + ", Nachname = " + Nachname + ", Vorname = " + Vorname + ", Geschlecht = " + Geschlecht;
    }

}
Code:
public class meinComp implements Comparator<Student> {

    @Override
    public int compare(Student a , Student b) {
        return a.getNachname().compareTo(b.getNachname());
    }
}
 
Tja, dann sollst du das wohl machen. Was hast du von der HashSet-Implementierung/Klasse schon umgesetzt (da du ja offensichtlich bereits eine HashSet Klasse benutzt ... hoffentlich nicht die aus java.util) und wo ist jetzt genau das Problem?
 
Das passt ja schon nicht:

Java:
Set<Student> studi = new HashSet<>();
// adding students
Iterator<Student> it = studi.iterator();
int input;
while (it.hasNext()) {

Wieso solltest du die Menü-Auswahl so oft machen wollen wie du Studenten hast?

Java:
@Override
public int compare(Student a , Student b) {
  return a.getNachname().compareTo(b.getNachname());
}

Wenn du Pech hast steht dann aber Anna Müller erst nach Berta Müller.
 
Zuletzt bearbeitet:
Mein Problem ist dass ich die Reihenfolge nicht hinbekomme, könnte man das Hashset mit einem Tree sortieren lassen? Außerdem kann ich keinen Studenten zu meinem Set über die Benutzereingabe hinzufügen da stürzt mein Programm immer ab.
 
Eine Hashtabelle ist übrigens nicht HashSet. Ein Set ist eine Menge von Unique Elemente. Selbst wenn du ein TreeSet verwendest wirst du ein Problem bekommen, wenn du diesen Comparator verwendest und ein Student den gleichen Namen trägt, aber eine andere Person ist. Du solltest die Haltung des Studenten von der sortierten Ausgabe unbedingt trennen.
 
Ich glaube nicht, dass dein Programm beim Einfügen abstürzt, sondern bei der Ausgabe. Deine while-Schleife bezieht sich auf den Iterator, welcher der zuvor hinzugefügten Elemente erhält. Und bei der Ausgabe verwendest du eben jenen Iterator und iterierst ihn bis zum Ende durch.

Java:
class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Set<Student> studi = new HashSet<>();

        studi.add(new Student(1, "Mustermann", "Max", "m"));
        studi.add(new Student(2, "Müller", "Bernd", "m"));
        studi.add(new Student(3, "Bauer", "Franz", "m"));

         // ENTFERNEN: Iterator<Student> it = studi.iterator();

        int input;

        do { // do-while

            System.out.println("Wählen Sie zwischen 1-4");
            System.out.println("1 = Student anlegen");
            System.out.println("2 = Student suchen");
            System.out.println("3 = Student löschen");
            System.out.println("4 = Liste ausgeben");
            System.out.println("5 = Beenden");

            input = sc.nextInt();
            switch (input) {
                case 1: //...
                    break;
                case 2: //...
                    break;
                case 3: // ...
                    break;
                case 4:
                    for (Student student : studi) {
                        System.out.println(student); // nimm das iterierte Element
                    }
                    break;
                case 5:
                    System.out.println("Programm wurde beendet!");
                     // UNNÖTIG System.exit(0);
                    break;
                default: // empfohlene Ergänzung
                    System.out.println("Unbekannte Eingabe");
            }
        } while(input != 5);
    }
}
 
Danke das hat mir schon mal geholfen 🙂
Jetzt hätt ich noch das Problem mit dem suchen nach bestimmten Studenten anhand einer Benutzereingabe eines bestimmten Namens und das löschen von bestimmten Studenten hab leider echt keine Ahnung wie man das schreiben soll 🙁
 
Na so wie die Ausgabe von allen Studenten auch.

Beispiel:
Java:
private void printStudentMitNummer(int matrikelnummer) {
        for(Student student : studenten) {
            if(student.getMatrikelNummer() == matrikelnummer) {
                System.out.println(student);
            }
        }
    }
 

Neue Themen


Zurück
Oben