Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Wie kann ich eine Map erzeugen aus Daten einer anderen Klasse ?

Empfohlene Antworten

  • 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 ... 

  • Antworten 107
  • Ansichten 12k
  • Erstellt
  • Letzte Antwort

Top-Poster in diesem Thema

Beliebteste Beiträge

  • 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,

  • Ich würde vorschlagen, mit einem Tutorial anzufangen. So wird das nichts. Der komplette Code macht überhaupt keinen Sinn.

  • Ich hab aber eher das Gefühl, dass du es nicht verstehen möchtest und dir auch egal ist, was hier geschrieben wird. Anstatt die Tipps anzunehmen und daran zu arbeiten, machst du komplett was anderes.

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.

 

  • 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 ..

  • 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.
 

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.

  • 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 ..

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

  • 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 von java_anfaenger

  • 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

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 von Whiz-zarD

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 von r4phi

  • 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 ?

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 von r4phi

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 von KeeperOfCoffee

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. ;)

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 :P Dann fängt das Problem aber schon früher an: Beim einlesen der Daten sicherstellen das die Matrikelnunmern eindeutig sind. 

  • 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

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.

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 von r4phi

  • 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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.