18. November 20204 j Autor vor 7 Minuten schrieb Whiz-zarD: Was hast du denn mit der Map vor? Die brauchst du nicht. Mach einfach eine Liste von Studenten anstatt eine Liste von Strings. So schwer ist es doch nicht mehr. List<Student> studentenDaten = new ArrayList<Student>(); studentenDaten.add(new Student("Test", 111111, "Fach1")); ... Die Übung für mich ist ja, dass ich mich mit der Map vertrauter mache ...
18. November 20204 j Dann ist aber die Aufgabe falsch und ich glaube auch nicht, dass du verstehst, wofür man die Map benötigt. Es geht darum, dass man über einen Schlüssel den passenden Wert ermitteln kann. Den Schlüssel brauchst du aber hier gar nicht, da du nicht nach dem Schlüssel abfragst. Wenn du unbedingt eine HashMap haben möchtest und der Schlüssel die die Matrikelnummer sein soll, dann muss die HashMap so aussehen: HashMap<integer, Student> Anstatt einen String hast du nun einen Studenten als Wert.
18. November 20204 j Autor vor 28 Minuten schrieb Whiz-zarD: Dann ist aber die Aufgabe falsch und ich glaube auch nicht, dass du verstehst, wofür man die Map benötigt. Es geht darum, dass man über einen Schlüssel den passenden Wert ermitteln kann. Den Schlüssel brauchst du aber hier gar nicht, da du nicht nach dem Schlüssel abfragst. Wenn du unbedingt eine HashMap haben möchtest und der Schlüssel die die Matrikelnummer sein soll, dann muss die HashMap so aussehen: HashMap<integer, Student> Anstatt einen String hast du nun einen Studenten als Wert. Das versuche ich aber die ganze Zeit zu erklären ... Bei der HasMap muss denke ich zu erst aber String dann Student stehen. Wie kann ich denn jetzt zu den Daten iterieren, also die Lieblingsfächer von der Klasse Daten holen ..
18. November 20204 j Autor vor 41 Minuten schrieb Whiz-zarD: Dann ist aber die Aufgabe falsch und ich glaube auch nicht, dass du verstehst, wofür man die Map benötigt. Es geht darum, dass man über einen Schlüssel den passenden Wert ermitteln kann. Den Schlüssel brauchst du aber hier gar nicht, da du nicht nach dem Schlüssel abfragst. Wenn du unbedingt eine HashMap haben möchtest und der Schlüssel die die Matrikelnummer sein soll, dann muss die HashMap so aussehen: HashMap<integer, Student> Anstatt einen String hast du nun einen Studenten als Wert. Sowas wie .. map initialisiern for(studentendaten durchlaufen) { student objekte erstellen map füllen } dann mit for schleife die map ausgeben.
18. November 20204 j Nein. Es ist doch inzwischen alles auf dem Tisch. Du musst doch nur noch alles zusammenfügen... public static void main(String[] args) { // Liste erzeugen List<Student> studentenDaten = new ArrayList<Student>(); // Liste mit Werten füllen studentenDaten.Add(new Student(...)); ... // Über die Liste iterieren for(Stundent student : studentenDaten) { // Student auf der Konsole ausgeben System.out.println(student.toString()); } } Ich glaub, das ist schon für dich schwierig genug und ich würde erstmal die HashMap weglassen und erst mal versuchen, den Code zu verstehen.
18. November 20204 j Autor vor 7 Minuten schrieb Whiz-zarD: Nein. Es ist doch inzwischen alles auf dem Tisch. Du musst doch nur noch alles zusammenfügen... public static void main(String[] args) { // Liste erzeugen List<Student> studentenDaten = new ArrayList<Student>(); // Liste mit Werten füllen studentenDaten.Add(new Student(...)); ... // Über die Liste iterieren for(Stundent student : studentenDaten) { // Student auf der Konsole ausgeben System.out.println(student.toString()); } } Ich glaub, das ist schon für dich schwierig genug und ich würde erstmal die HashMap weglassen und erst mal versuchen, den Code zu verstehen. Den Code verstehe ich... ich würde es aber in eine HashMap umwandeln wollen ..
18. November 20204 j Dann tu es doch. HashMap<integer, Student> studentenDaten = new HashMap<integer, Student>(); // Liste mit Werten füllen studentenDaten.put(..., new Student(...)); ... Und was hast du damit dann vor? Bearbeitet 18. November 20204 j von Whiz-zarD
18. November 20204 j Okay. Ich bin raus. Das verwirrt mich maximal. Vor allem verstehe ich den Einsatz der Map in diesem Kontext nicht. Liste -> Map -> Map ausgeben. Sinnvoll wäre: - Den String “splitten” - Damit dann ein Objekt von Student erzeugen - Objekte in eine Liste packen - Liste ausgeben Wenn es eine Map sein soll - Den String “splitten” - Damit dann ein Objekt von Student erzeugen - Objekt in die Map packen wobei der Key die Matrikel Nummer ist - Ausgabe key + value
18. November 20204 j Autor vor 2 Minuten schrieb r4phi: Okay. Ich bin raus. Das verwirrt mich maximal. Vor allem verstehe ich den Einsatz der Map in diesem Kontext nicht. Liste -> Map -> Map ausgeben. Sinnvoll wäre: - Den String “splitten” - Damit dann ein Objekt von Student erzeugen - Objekte in eine Liste packen - Liste ausgeben Wenn es eine Map sein soll - Den String “splitten” - Damit dann ein Objekt von Student erzeugen - Objekt in die Map packen wobei der Key die Matrikel Nummer ist - Ausgabe key + value Genau ... Wenn es eine Map sein soll - Den String “splitten” - Damit dann ein Objekt von Student erzeugen - Objekt in die Map packen wobei der Key die Matrikel Nummer ist - Ausgabe key + value wie mache ich das .. Bearbeitet 18. November 20204 j von java_anfaenger
18. November 20204 j Autor vor 17 Minuten schrieb Whiz-zarD: Dann tu es doch. HashMap<integer, Student> studentenDaten = new HashMap<integer, Student>(); // Liste mit Werten füllen studentenDaten.put(..., new Student(...)); ... Und was hast du damit dann vor? Ich möchte doch die Lieblingsfächer ausgeben mit der Matrikelnummer Schlüssel : Matrikelnummer - > Wert : Student-Objekt
18. November 20204 j Dafür brauchst du keine Map... public static void main(String[] args) { // Liste erzeugen List<Student> studentenDaten = new ArrayList<Student>(); // Liste mit Werten füllen studentenDaten.Add(new Student(...)); ... // Über die Liste iterieren for(Stundent student : studentenDaten) { // Student auf der Konsole ausgeben System.out.println("Student: " + student.getMatrikelnummer() + " | " + "Lieblingsfach: " + student.getLieblingsfach()); } } Eine Map wird benötigt, wenn du in einer Menge von Studenten einen bestimmten Studenten mittels der Matrikelnummer suchst: HashMap<integer, Student> students = new HashMap<integer, Student>(); students.put(1111, new Student("Test1", 1111, "Mathe")); Student student = students.get(1111); System.out.println("Student: " + student.getMatrikelnummer() + " | " + "Lieblingsfach: " + student.getLieblingsfach()); Bearbeitet 18. November 20204 j von Whiz-zarD
18. November 20204 j Laut deinem String hat jeder Student doch nur ein Lieblingsfach. Jedenfalls: Splitten anhand des ; müsste ein Array mit Länge 3 rauskommen sonst Exception. Neues Studenten Objekt erstellen mit den jeweiligen Werten aus dem Array welches das Ergebnis des Split ist. Dann map.put(studentObj.getNummer(), studentenObj.getLieblingsfach()) Für jeden Studenten. Dann map.entrySet().forEach(x -> System.out.println(“Nummer: “ + x.getKey() + “ Lieblingsfach: “ + x.getValue()); Das war’s... Bearbeitet 18. November 20204 j von r4phi
18. November 20204 j @Whiz-zarD Da fehlt ein NullCheck bei dem auslesen aus der Map. Wenn kein Eintrag gefunden wird gibt es null zurück. Dann knall das beim Zugriff auf die properties. Zudem ist das students.get(1111). Nicht über den “Index” Bearbeitet 18. November 20204 j von r4phi
18. November 20204 j @r4phi: Ja, hab ich korrigiert. Java ist chon zu lange her. Bin C# verwöhnt.😄 null check hab ich erst mal weggelassen. Ich glaub, das verwirrt noch mehr. Das ist jetzt schon alles recht verwirrend.
18. November 20204 j @Whiz-zarD bei mir ist es genau anders herum 😅 aber ja. Stimmt. Das ist verwirrend genug 😅
18. November 20204 j Autor vor 19 Minuten schrieb Whiz-zarD: Dafür brauchst du keine Map... public static void main(String[] args) { // Liste erzeugen List<Student> studentenDaten = new ArrayList<Student>(); // Liste mit Werten füllen studentenDaten.Add(new Student(...)); ... // Über die Liste iterieren for(Stundent student : studentenDaten) { // Student auf der Konsole ausgeben System.out.println("Student: " + student.getMatrikelnummer() + " | " + "Lieblingsfach: " + student.getLieblingsfach()); } } Eine Map wird benötigt, wenn du in einer Menge von Studenten einen bestimmten Studenten mittels der Matrikelnummer suchst: HashMap<integer, Student> students = new HashMap<integer, Student>(); students.put(1111, new Student("Test1", 1111, "Mathe")); Student student = students[1111]; System.out.println("Student: " + student.getMatrikelnummer() + " | " + "Lieblingsfach: " + student.getLieblingsfach()); Aber ich hab doch eine String liste muss dann nicht integer zu String werden und dann würde put ja nicht funktionieren ?
18. November 20204 j Okay. Also gefühlt hast du das ganze noch nicht verstanden. Prinzipiell kannst du natürlich auch schreiben new HashMap<String, Student> Dadurch ist dann der Key in deiner Map vom Typ String. Da aber die Matrikel Nummer eigentlich ein Integer ist hat Whiz die Map so aufgebaut. Dein größtes Problem ist die Tatsache das dein Datensatz nur ein Text ist wo die Daten aneinandergereiht sind. Das müsstest du auflösen und in ein entsprechendes Objekt (Student) packen. Dadurch bist du viel flexibler und kommst auch einfacher zum Ziel. Daran hapert es allerdings scheinbar schon bei dir. Bearbeitet 18. November 20204 j von r4phi
18. November 20204 j vor 28 Minuten schrieb r4phi: Da fehlt ein NullCheck bei dem auslesen aus der Map Wenn du schon so genau hinsiehst, dann bitte auch überprüfen, ob der Key nicht bereits der HashMap hinzugefügt wurde^^ Edit: btw wenn du ne HashMap aus Performancegründen willst => bei so geringen Datenmengen bringt das gar nichts... Bearbeitet 18. November 20204 j von KeeperOfCoffee
18. November 20204 j Stichwort ist hier "Deserialisierung" oder auf Neu-Deutsch "Mapping". Du schreibst eine Methode, die den String als Parameter übegeben bekommt und ein Student zurückgibt: private static Student deserialize(string data) { // ... } Und dann schreibst du halt einfach: HashMap<integer, Student> students = new HashMap<integer, Student>(); Student student = deserialize("Test1;1111;Mathe"); students.put(student.getMatrikelnummer(), student); student = deserialize("Test2;2222;Physik"); students.put(student.getMatrikelnummer(), student); //... mit der Split()-Methode am String bekommst du ein Array von Strings und mit der Integer.parseInt()-Methode kannst du ein String in ein Integer wandeln. Viel spaß bei der Implementierung von deserialize(). Das kann auch mal deine Aufgabe sein.
18. November 20204 j vor 1 Minute schrieb KeeperOfCoffee: Wenn du schon so genau hinsiehst, dann bitte auch überprüfen, ob der Key nicht bereits der HashMap hinzugefügt wurde^^ Dann würde der alte Wert ersetzt werden. Also keine Exception Dann fängt das Problem aber schon früher an: Beim einlesen der Daten sicherstellen das die Matrikelnunmern eindeutig sind.
18. November 20204 j Autor vor 1 Stunde schrieb Whiz-zarD: Stichwort ist hier "Deserialisierung" oder auf Neu-Deutsch "Mapping". Du schreibst eine Methode, die den String als Parameter übegeben bekommt und ein Student zurückgibt: private static Student deserialize(string data) { // ... } Und dann schreibst du halt einfach: HashMap<integer, Student> students = new HashMap<integer, Student>(); Student student = deserialize("Test1;1111;Mathe"); students.put(student.getMatrikelnummer(), student); student = deserialize("Test2;2222;Physik"); students.put(student.getMatrikelnummer(), student); //... mit der Split()-Methode am String bekommst du ein Array von Strings und mit der Integer.parseInt()-Methode kannst du ein String in ein Integer wandeln. Viel spaß bei der Implementierung von deserialize(). Das kann auch mal deine Aufgabe sein. Ich danke dir erstmals für den Anfang, doch ich hab echt kein Plan was da rein soll in die Student methode.. wo in deinem Beispiel greifen wir auf die Liste von der Daten Klasse ein
19. November 20204 j Wir drehen uns hier im Kreis... Ich dachte, du würdest den oberen Code verstehen. Anscheinend ja wohl doch nicht... Drauf zugreifen tust du, indem wir über die Liste iterieren, wie hier beschrieben: vor 8 Stunden schrieb Whiz-zarD: // Über die Liste iterieren for(Stundent student : studentenDaten) { // Student auf der Konsole ausgeben System.out.println("Student: " + student.getMatrikelnummer() + " | " + "Lieblingsfach: " + student.getLieblingsfach()); } Zuvor musst du aber dein String "Test1;1111;Mathe" in ein Student-Objekt umwandeln und das machst du mit der von mir vorgeschlagenen deserialize()-Methode. Bei der Liste sieht es dann so aus: // Liste erzeugen List<Student> studentenDaten = new ArrayList<Student>(); // Liste mit Werten füllen studentenDaten.Add(deserialize("Test1;1111;Mathe")); ... Und deine Aufgabe ist nun, die deserialize()-Methode zu schreiben. Mehr werde ich dazu auch nicht mehr schreiben, da es nichts bringt, wenn man dir den Code diktiert. Du lernst daraus nichts.
19. November 20204 j Hier mal das ganze basierend auf deinen "studidaten" Deine Aufgabe ist es nun, wie @Whiz-zarD bereits gesagt hat: Implementieren der deserialize Methode in der Studenten-Klasse. Wenn das geschafft ist dann wieder melden package de.fachinformatiker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { final List<String> serializedStudents = datenstudi(); // Aus deinen Daten eine Liste von studenten objekten erzeugen. List<Student> deserializedStudents = serializedStudents.stream() .map(Student::deserialize) .collect(Collectors.toList()); Map<Integer, Student> studentsMap = new HashMap<Integer, Student>(); // jeden Studenten der Map hinzufügen wobei die Martrikelnummer der Key ist for (Student s : deserializedStudents) { studentsMap.put(s.getMatrikelnummer(), s); } // ODER // deserializedStudents.forEach(s -> studentsMap.put(s.getMatrikelnummer(), s)); // ODER // Map<Integer, Student> studentsMap = deserializedStudents.stream().collect(Collectors.toMap(Student::getMatrikelnummer, s -> s, (a, b) -> b)); // Ausgabe der Matrikelnummer und des Lieblingsfach in der Konsole // Die Map ausgeben for (Map.Entry<Integer, Student> entry : studentsMap.entrySet()) { Integer matrikelnummer = entry.getKey(); String lieblingsfach = entry.getValue().getLieblingsfach(); System.out.println("Martrikelnummer: " + matrikelnummer + "Lieblingsfach: " + lieblingsfach); } // ODER // studentsMap.forEach((k, v) -> System.out.println("Martrikelnummer: " + k + "Lieblingsfach: " + v.getLieblingsfach())); } public static List<String> datenstudi() { List<String> studidaten = new ArrayList<String>(); // Format: // Name ; Matrikelnummer ; Lieblingsfach studidaten.add("Test uno;999999;fach I"); studidaten.add("Horst Lied;111111;fach II"); return studidaten; } } class Student { private String name; private String lieblingsfach; private int matrikelnummer; public Student(String name, String lieblingsfach, int matrikelnummer) { this.name = name; this.lieblingsfach = lieblingsfach; this.matrikelnummer = matrikelnummer; } public String getName() { return this.name; } public String getLieblingsfach() { return this.lieblingsfach; } public int getMatrikelnummer() { return this.matrikelnummer; } public static Student deserialize(final String serializedString) { // Das musst du selbst implementieren... // Deinen "Datenstring" aufteilen // Die einzelnen Werte des Datenstrings nutzen um ein Studenten Objekt zu erstellen // new Student(name, lieblingsfach, matrikelnummer) // Objekt zurückliefern throw new UnsupportedOperationException("Das hier habe ich noch nicht implementiert"); } } Bearbeitet 19. November 20204 j von r4phi
19. November 20204 j Viellicht wäre es mal ganz hilfreich, wenn du erst einmal erklärst, in welchem Zusammenhang du diese "Aufgabe" bearbeitest und dann die konkrete Aufgabenstellung postest, statt Code-Schnipsel und das, was du am Ende ausgegeben haben willst mit der Bedingung, dass es eine (Hash-)Map sein soll.
19. November 20204 j Autor vor 6 Stunden schrieb r4phi: Hier mal das ganze basierend auf deinen "studidaten" Deine Aufgabe ist es nun, wie @Whiz-zarD bereits gesagt hat: Implementieren der deserialize Methode in der Studenten-Klasse. Wenn das geschafft ist dann wieder melden package de.fachinformatiker; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { final List<String> serializedStudents = datenstudi(); // Aus deinen Daten eine Liste von studenten objekten erzeugen. List<Student> deserializedStudents = serializedStudents.stream() .map(Student::deserialize) .collect(Collectors.toList()); Map<Integer, Student> studentsMap = new HashMap<Integer, Student>(); // jeden Studenten der Map hinzufügen wobei die Martrikelnummer der Key ist for (Student s : deserializedStudents) { studentsMap.put(s.getMatrikelnummer(), s); } // ODER // deserializedStudents.forEach(s -> studentsMap.put(s.getMatrikelnummer(), s)); // ODER // Map<Integer, Student> studentsMap = deserializedStudents.stream().collect(Collectors.toMap(Student::getMatrikelnummer, s -> s, (a, b) -> b)); // Ausgabe der Matrikelnummer und des Lieblingsfach in der Konsole // Die Map ausgeben for (Map.Entry<Integer, Student> entry : studentsMap.entrySet()) { Integer matrikelnummer = entry.getKey(); String lieblingsfach = entry.getValue().getLieblingsfach(); System.out.println("Martrikelnummer: " + matrikelnummer + "Lieblingsfach: " + lieblingsfach); } // ODER // studentsMap.forEach((k, v) -> System.out.println("Martrikelnummer: " + k + "Lieblingsfach: " + v.getLieblingsfach())); } public static List<String> datenstudi() { List<String> studidaten = new ArrayList<String>(); // Format: // Name ; Matrikelnummer ; Lieblingsfach studidaten.add("Test uno;999999;fach I"); studidaten.add("Horst Lied;111111;fach II"); return studidaten; } } class Student { private String name; private String lieblingsfach; private int matrikelnummer; public Student(String name, String lieblingsfach, int matrikelnummer) { this.name = name; this.lieblingsfach = lieblingsfach; this.matrikelnummer = matrikelnummer; } public String getName() { return this.name; } public String getLieblingsfach() { return this.lieblingsfach; } public int getMatrikelnummer() { return this.matrikelnummer; } public static Student deserialize(final String serializedString) { // Das musst du selbst implementieren... // Deinen "Datenstring" aufteilen // Die einzelnen Werte des Datenstrings nutzen um ein Studenten Objekt zu erstellen // new Student(name, lieblingsfach, matrikelnummer) // Objekt zurückliefern throw new UnsupportedOperationException("Das hier habe ich noch nicht implementiert"); } } public static Student deserialize(final String serializedString) { String[]splitted = "name;Matrikelnummer;lieblingsfach".split(","); new Student(Name,Matrikelnummer,Matrikelnummer); throw new UnsupportedOperationException("Das hier habe ich noch nicht implementiert"); } ist das mit dem splitten so richtig ?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.