Zum Inhalt springen

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


Empfohlene Beiträge

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

Geschrieben

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.

 

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

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

Geschrieben

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.

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

Geschrieben (bearbeitet)

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

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

Geschrieben (bearbeitet)

 

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
Geschrieben
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

Geschrieben (bearbeitet)

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
Geschrieben (bearbeitet)

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

Geschrieben (bearbeitet)

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
Geschrieben (bearbeitet)
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
Geschrieben

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

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

Geschrieben
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

Geschrieben

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.

Geschrieben (bearbeitet)

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...