Hash problem

flashdog

Bekanntes Mitglied
Hallo,
ich möchte die folgende Datei
Java:
Key1_1, Key2_1,  Key3_1, data1_1, data2_1, data3_1
Key1_2, Key2_2, Key3_2, data1_2, data2_2, data3_2
Key1_3, Key2_3, Key3_3, data1_3, data2_3, data3_3
Key1_4, Key2_4, Key3_4, data1_4, data2_4, data3_4

in Hash speichern, wobei die ersten drei Spalten als Schlüssel dienen sollen die restliche zwei Spalten als Werte.

Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    String strLine;
    while ((strLine = br.readLine()) != null) {    
      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }
      System.out.println();
    }
  }
}

Welche Datenstruktur ist dazu die geeignetste?

Viele Grüße
 
hm, mit dem hash(-code) an sich hat das eigentlich nicht wirkllich was zu tun, außer vielleicht, dass für schlüssel-wert-paare wohl die geeignetste struktur eine (hash-)map ist. das "hash" bezieht sich dabei aber nur auf die interne implementierung.

wie du es in deinem code auch schon tust, liest du die zeilen am besten aus, entfernst die leerzeilen, konkatenierst die ersten drei werte als string key zusammen, und die anderen drei werte als string value.

dann brauchst du noch eine map, und legst die paare mit put(key, value) dort hinein.
 
Habe den Code mit verschachtelten HashMap erweitert, aber ich weiss nicht ob ich es richtig gemacht habe.
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    HashMap key3 = new HashMap();
    HashMap key2 = new HashMap();
    HashMap key1 = new HashMap();

    String strLine;
    while ((strLine = br.readLine()) != null) {

      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }
      key3.put(line[2], new String[]{line[3], line[4]});
      key2.put(line[1], key3);
      key1.put(line[0], key2);
     
      System.out.println();
    }
    System.out.println(key1.get("Key1_1"));
  }
}

Wie kann ich den kompletten Inhalt vom HashMap ausgeben um zu testen ob alles richtig abgespeichert wurde?
Und wie kann ich anschließend die Array Einträge ändern?
 
Hashmap ausgeben:

Java:
// map sei deine Hashmap

Iterator<String> keyIt = map.keySet().iterator();
System.out.println("Map: [");
while(keyIt.hasNext()) {
    String key = keyIt.next();
    System.out.println(key + " => " map.get(key));
}
System.out.println("]");

map.toString() sollte aber ein ähnliches Ergebnis liefern ... (ohne es ausprobiert zu haben)

mpG
Tobias

//EDIT: Warum willst du die Array-Einträge ändern? Auf die HashMap hat das dann keine Auswirkungen mehr!
 
@ Tobias: Leider habe ich es nicht verstanden was du mit "map sei deine Hashmap" meinst und wie man es in Code einbaut. Mit
Java:
System.out.println(key1.toString());
bekomme ich diese Ausgabe:
Java:
{Key1_2={Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}, Key1_1={Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}, Key1_4={Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}, Key1_3={Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}}

Ich möchte nicht die Schlüssel ändern sondern nur den Zugang zu diesen Array bekommen "new String[]{line[3], line[4]}" um mit den Werten arbeiten zu können.
 
Ersetze map durch key1.

Die Werte kannst du auslesen, in dem du zum Beispiel

Java:
String[] values = key1.get("key1_2").get("key2_4").get("key3_1");

schreibst.
 
Habe map durch key1 ersetzt und bekomme diese Ausgabe:
Map: [
Key1_2 => {Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}
Key1_1 => {Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}
Key1_4 => {Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}
Key1_3 => {Key2_4={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_2={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_3={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}, Key2_1={Key3_1=[Ljava.lang.String;@19189e1, Key3_2=[Ljava.lang.String;@1f33675, Key3_3=[Ljava.lang.String;@7c6768, Key3_4=[Ljava.lang.String;@1690726}}
]

Das zweit get in key1.get("key1_2").get("key2_4").get("key3_1"); wird nicht erkannt.

Wie könnte man es zu laufen kriegen?
 
"Wird nicht erkannt" heißt vermutlich "Ich bekomme eine NullPointerException"? Dann schreib die Schlüssel mal so, wie du sie in der Map angelegt hast, also "Key1_2" etc statt "key1_2". Bißchen Eigeninitiative ...
 
Den Fehler mit k und K habe ich gar nicht gesehen und habe es korrigiert.

Wenn ich den Code compiliere bekomme ich folgende Fehlermeldung:
Java:
HashMapKey.java:45: cannot find symbol
symbol  : method get(java.lang.String)
location: class java.lang.Object
    String[] values = key1.get("Key1_2").get("Key2_4").get("Key3_1");
 
versuch mal

Java:
String[] values = (String[])((HashMap)((HashMap) key1.get("Key1_2")).get("Key2_4")).get("Key3_1");
 
Zuletzt bearbeitet:
Java:
String[] values = (String[]) ((HashMap) ((HashMap) key1.get("Key1_1")).get("Key2_1")).get("Key3_1");
Hat funktioniert, aber wenn ich values Array ändere hat dies kein Einfluss auf HashMap. Wie kann das Array im HashMap ändern bzw. das geänderte values Array in HashMap speichern?
 
Du solltest dir baldmöglichst angewöhnen, nur noch typisierte Collections zu benutzen. Das Zauberwort bei Google ist "Java Generics".
 
Ok habe den Code geändert, aber leider weiss ich noch nicht wie man HashMap ganz auf den Bildschirm ausgeben kann denn ich bekomme nur dies
Java:
Map: [
Key1_2 => {Key2_4={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_2={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_3={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_1={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}}
Key1_1 => {Key2_4={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_2={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_3={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_1={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}}
Key1_4 => {Key2_4={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_2={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_3={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_1={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}}
Key1_3 => {Key2_4={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_2={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_3={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}, Key2_1={Key3_1=[Ljava.lang.String;@7c6768, Key3_2=[Ljava.lang.String;@1690726, Key3_3=[Ljava.lang.String;@5483cd, Key3_4=[Ljava.lang.String;@9931f5}}
]

Hier ist der vollständige Code:
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    HashMap key3 = new HashMap();
    HashMap key2 = new HashMap();
    HashMap key1 = new HashMap();

    String strLine;
    while ((strLine = br.readLine()) != null) {

      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }
      key3.put(line[2], new String[]{line[3], line[4]});
      key2.put(line[1], key3);
      key1.put(line[0], key2);

      System.out.println();
    }

    //System.out.println(key1.toString());
    Iterator<String> keyIt = key1.keySet().iterator();
    System.out.println("Map: [");
    while (keyIt.hasNext()) {
      String key = keyIt.next();
      System.out.println(key + " => " + key1.get(key));
    }
    System.out.println("]");

    String[] values = (String[]) ((HashMap) ((HashMap) key1.get("Key1_1")).get("Key2_1")).get("Key3_1");
    for (String h : values) {
      System.out.println(h);
    }

    key3.put("key3_1", new String[]{"Hallo", "Java"});
    key2.put("Key2_1", key3);
    key1.put("Key1_1", key2);
  }
}

@ Tobias: Meinst du
HashMap<String, String> key1 = new HashMap<String, String>();
?
 
Solltest Generics benutzen. (Edit: Ok hat ja Tobias schon gesagt. Zu deiner Frage dann: ja meint er 🙂)

Java:
for ( Entry<String, String> entry : deineMap.entrySet() ) {
System.out.println( entry.getKey() );
System.out.println( entry.getValue() );
}
 
Im Prinzip meine ich das, da du aber HashMaps schachtelst, mußt du auch deine Generics schachteln. Also sowas wie:

Java:
Map<String, Map<String, Map<String, String[]>>> meineMap;

Dann "wissen" die get()-Methoden, welchen Typ von Schlüssel sie brauchen und welchen Typ sie zurückgeben.
 
versuch mal

Java:
String[] values = (String[])((HashMap)((HashMap) key1.get("Key1_2")).get("Key2_4")).get("Key3_1");

ARGH... das meint ihr doch wohl nicht ernst ??? solche konstrukte kommen in euren kopf ???

Eine eigene Klasse mit den 6 Werten, überschriebenes hashCode() und equals() .
^^
this

hm, mit dem hash(-code) an sich hat das eigentlich nicht wirkllich was zu tun, außer vielleicht, dass für schlüssel-wert-paare wohl die geeignetste struktur eine (hash-)map ist. das "hash" bezieht sich dabei aber nur auf die interne implementierung.
hae ? du behauptest hashcode haette mit (hash)maps nix zu tun ? woher kommt wohl der Name HashMap ?
natuerlich brauchst du bei einer eigenen Klasse hashcode und equals... sonst wird das nix mit dem speichern in einer map.
 
Hallo,
ich möchte die folgende Datei
Java:
Key1_1, Key2_1,  Key3_1, data1_1, data2_1, data3_1
Key1_2, Key2_2, Key3_2, data1_2, data2_2, data3_2
Key1_3, Key2_3, Key3_3, data1_3, data2_3, data3_3
Key1_4, Key2_4, Key3_4, data1_4, data2_4, data3_4

in Hash speichern, wobei die ersten drei Spalten als Schlüssel dienen sollen die restliche zwei Spalten als Werte.

[...]

Welche Datenstruktur ist dazu die geeignetste?

Viele Grüße

also ich denke er hat nur eine möglichkeit gesucht, das zeug in 3 (hash-)maps zu speichern. wie diese intern implementiert ist, juckt den nutzer doch wenig, oder? 🙂

und das mit dem dreifach casten ist nur eine möglichkeit, dass aus seiner map rauszuholen, ohne dass es fehler hagelt. dass es mit generischen maps eleganter geht steht ja außer frage, aber das war ja nicht der fall, und ihn dazu zu missionieren hatte ich nicht für angebracht gehalten. da er gerade erst den umgang mit hashmaps lernt, und generics in seinem lehrplan wohl noch anstehen, wollte ich nur sein aktuelles problem lösen, mehr nicht 🙂

dass es auch mit eigenen objekten (mit überschriebenen hashcode und equals) eleganter ist, steht ebenfalls außer frage, aber ich weiß nicht ob das sinn der aufgabe war. 🙂
 
Hier geht es doch nicht um schönen Code, sondern darum, das Flashdog den Umgang mit Hashmaps und dem Collection-Framework ganz allgemein lernt. Da braucht man den doch nicht mit Antworten wie "eigene Objekte" oder "Apache MultiMap" verwirren.

Und bei der Überschrift "Hash-Problem" habe ich auch erst eine Mathefrage zur Berechnung eines eindeutigen Hashcodes vermutet ...
 
Hier geht es doch nicht um schönen Code, sondern darum, das Flashdog den Umgang mit Hashmaps und dem Collection-Framework ganz allgemein lernt
aber er soll lernen sowas zu schreiben ?
versuch mal

Java:
String[] values = (String[])((HashMap)((HashMap) key1.get("Key1_2")).get("Key2_4")).get("Key3_1");

und wenn er fragt "Welche Datenstruktur ist dazu die geeignetste?"

dann ist nun mal die sinnigste Antwort die eigenen Datenstruktur und nicht irgendwelche abstrusen Verrenkungen mit zusammengeschusterten Maps
 
Ich kam erst dazu, als der TO bereits beschlossen hatte, diesen durchaus sinnvollen Vorschlag nicht zu befolgen 😉 ... *unschuldig*

EDIT: Auf die verschachtelten Maps ist der TO übrigens von selbst gekommen, der erste Map-bezogene Vorschlag war die Key-Strings zu konkatenieren und in einer einfachen Hashmap gegen die Werte zu mappen. Immer noch nicht so gut wie eine eigene Datenstruktur, aber immer noch besser als das, was am Ende rausgekommen ist.
 
Zuletzt bearbeitet:
Im Moment habe ich noch Probleme mit Generics. Wenn das Programm mit HashMap und Generics läuft bin ich auch interessiert an eigenen objekten mit überschriebenen hashcode und equals.

Ich habe versucht dies im Code einzubauen
Java:
 HashMap<String, HashMap<String, HashMap<String, String[]>>> meinHashMap;
aber leider bekomme ich Errors wenn ich Elemente in HashMap wie folgt ablegen möchte:

Java:
//meinHashMap.put(line[0], new HashMap<line[1],new HashMap<String, line[2], new String[]{line[3], line[4]}>>);
meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);

Errors:
Java:
HashMapKey.java:35: ']' expected
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
HashMapKey.java:35: illegal start of expression
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
HashMapKey.java:35: ']' expected
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
HashMapKey.java:35: illegal start of expression
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
HashMapKey.java:35: illegal start of expression
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
5 errors

Der Code sieht wie folgt aus:
Java:
//
//
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

//    HashMap key3 = new HashMap();
//    HashMap key2 = new HashMap();
//    HashMap key1 = new HashMap();
    
    HashMap<String, HashMap<String, HashMap<String, String[]>>> meinHashMap;
    String strLine;
    while ((strLine = br.readLine()) != null) {

      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }
//      key3.put(line[2], new String[]{line[3], line[4]});
//      key2.put(line[1], key3);
//      key1.put(line[0], key2);

      //meinHashMap.put(line[0], new HashMap<line[1],new HashMap<String, line[2], new String[]{line[3], line[4]}>>);
      meinHashMap.put(line[0], <line[1],<String, line[2], new String[]{line[3], line[4]}>>);
      System.out.println();
    }

    //System.out.println(key1.toString());
    Iterator<String> keyIt = key1.keySet().iterator();
    System.out.println("Map: [");
    while (keyIt.hasNext()) {
      String key = keyIt.next();
      System.out.println(key + " => " + key1.get(key));
    }
    System.out.println("]");

    String[] values = (String[]) ((HashMap) ((HashMap) key1.get("Key1_1")).get("Key2_1")).get("Key3_1");
    for (String h : values) {
      System.out.println(h);
    }

    key3.put("key3_1", new String[]{"Hallo", "Java"});
    key2.put("Key2_1", key3);
    key1.put("Key1_1", key2);
  }
}

Wie könnte ich es korrigieren?
 
Naja, die Compilerfehler zeigen ja schon, dass das kein gültiger Javacode ist.

So in etwa geht es:

Java:
HashMap<String, HashMap<String, HashMap<String, String[]>>> huelle = new HashMap<String, HashMap<String, HashMap<String, String[]>>>();

HashMap<String, HashMap<String, String[]>> zwischenschicht = new HashMap<String, HashMap<String, String[]>>();

HashMap<String, String[]> innen = new HashMap<String, String[]>();

innen.put("key3", new String[] {"value1", "value2", "value3" });
innen.put("key3_1", new String[] {"value1_1", "value2_1", "value3_1" });

zwischenschicht.put("key2", innen);
huelle.put("key1", zwischenschicht);

String[] werte = huelle.get("key1").get("key2").get("key3"); // KEIN CAST!
System.out.println(werte[0]); // -> value1
 
Danke, es funktioniert, aber wie könnte ich den Inhalt von HashMap mit foreach ausgeben, d.h. um die folgende Ausgabe zu erhalten?

Java:
[Key1_1][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_4][Key3_4][data1_4][data2_4][data3_4]

Der korrigierte Code sieht wie folgt aus:
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    HashMap<String, HashMap<String, HashMap<String, String[]>>> huelle =
            new HashMap<String, HashMap<String, HashMap<String, String[]>>>();
    HashMap<String, HashMap<String, String[]>> zwischenschicht =
            new HashMap<String, HashMap<String, String[]>>();
    HashMap<String, String[]> innen =
            new HashMap<String, String[]>();

    String strLine;
    while ((strLine = br.readLine()) != null) {

      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }

      innen.put(line[2], new String[]{line[3], line[4], line[5]});
      zwischenschicht.put(line[1], innen);
      huelle.put(line[0], zwischenschicht);

      System.out.println();
    }

    String[] werte = huelle.get("Key1_1").get("Key2_1").get("Key3_1");
    for (String h : werte) {
      System.out.println(h);
    }
  }
}
 
Ich fand das Beispiel mit den geschachtelten Maps auch sehr verwirrend.
Ich bin blutiger Anfänger und versuche bald den SCJP zu machen, da ich dafür auch Collections brauche, habe ich mal eine andere Lösung versucht, doch leider funktioniert es nicht wie gedacht.
Die Daten werden zwar in die Map geschrieben, sind auch zu sehen, wenn man sie sofort wieder ausliest, aber wenn ich sie später auslesen möchte steht da immer das gleiche drin und passt auch nicht zum Key.
Hat jemand eine Ahnung wo der Fehler liegt?
Die Debugausgaben habe ich mal drin gelassen.

Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.*;

public class HashMapKey
{
  // ===== AllKeys =====
  private class AllKeys
  {
    private String key1 = "";
    private String key2 = "";
    private String key3 = "";

    public AllKeys ()
    {
      this("", "", "");
    }
    public AllKeys (String key1, String key2, String key3)
    {
      setAllKeys(key1, key2, key3);
    }
    public void setAllKeys (String key1, String key2, String key3)
    {
      this.key1 = key1;
      this.key2 = key2;
      this.key3 = key3;
    }
    public int hashCode()
    {
      int hash = 0;
      hash  = key1.hashCode();
      hash += key2.hashCode();
      hash += key3.hashCode();
      System.out.println ("hashCode=" + hash);
      return hash;
    } //hashCode

    public boolean equals(Object o)
    {
      AllKeys ak = new AllKeys();
      if (o instanceof AllKeys)
      {
       ak = (AllKeys)o;
      }
      else
      {
        return false;
      }
      System.out.println ("this.key1=" + key1 + " ak.key1=" + ak.key1);
      System.out.println ("this.key2=" + key2 + " ak.key2=" + ak.key2);
      System.out.println ("this.key3=" + key3 + " ak.key3=" + ak.key3);
      if (!this.key1.equals(ak.key1))
      {
        return false;
      }
      if (!key2.equals(ak.key2))
      {
        return false;
      }
      if (!key3.equals(ak.key3))
      {
        return false;
      }
      return true;
    } //equals

    public String toString()
    {
      String ergebnis = "";
      if (key1 != null)
        ergebnis += key1 + " ";
      if (key2 != null)
        ergebnis += key2 + " ";
      if (key3 != null)
        ergebnis += key3;
      return ergebnis;
    }

    public void testEquals ()
    {
      AllKeys ak1 = new AllKeys();
      AllKeys ak2 = new AllKeys();
      AllKeys ak3 = new AllKeys();
      ak1.setAllKeys("Key1_1", "Key2_1", "Key3_1");
      ak2.setAllKeys("Key1_1", "Key2_1", "Key3_1");
      ak3.setAllKeys("Key1_2", "Key2_2", "Key3_2");
      System.out.println ("ak1;ak2: equals="+ak1.equals(ak2)+" hash="+(ak1.hashCode() == ak2.hashCode())+"\n");
      System.out.println ("ak1;ak3: equals="+ak1.equals(ak3)+" hash="+(ak1.hashCode() == ak3.hashCode())+"\n");
    }
  } //AllKeys

  // ===== Values =====
  private class Values
  {
    private String myData1 = "";
    private String myData2 = "";
    private String myData3 = "";

    public Values ()
    {
      this("", "", "");
    }

    public Values (String myData1, String myData2, String myData3)
    {
      setValues(myData1, myData2, myData3);
    }

    public void setValues (String myData1, String myData2, String myData3)
    {
      this.myData1 = myData1;
      this.myData2 = myData2;
      this.myData3 = myData3;
    }

    public String toString()
    {
      String ergebnis = "";
      if (myData1 != null)
        ergebnis += myData1 + " ";
      if (myData2 != null)
        ergebnis += myData2 + " ";
      if (myData3 != null)
        ergebnis += myData3;
      return ergebnis;
    }
  } //Values

  public void go() throws FileNotFoundException, IOException
  {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    HashMap<AllKeys, Values> oneMap = new HashMap<AllKeys, Values>();

    AllKeys myKeys = new AllKeys();
    AllKeys resultKeys = new AllKeys();
    Values myData = new Values();
    Values resultData = new Values();

    String strLine;
    while ((strLine = br.readLine()) != null)
    {
      String[] line = strLine.replaceAll(" ", "").trim().split(",");
      System.out.println("\nnext line:");
      for (int i = 0; i < line.length; i++)
      {
        System.out.print("[" + line[i] + "]");
      }
      System.out.println();
      myKeys.setAllKeys(line[0], line[1], line[2]);
      myData.setValues(line[3], line[4], line[5]);
      System.out.println (myKeys.toString());
      if (myData != null)
      {
        System.out.println (myData.toString());
      }

      oneMap.put(myKeys, myData); //Daten in Map schreiben

      resultData = oneMap.get(myKeys); // Daten sofort wieder lesen
      System.out.println ("\nafter insert:\n" + myKeys.toString());
      if (resultData != null)
      {
        System.out.println (resultData.toString());
      }
      else
      {
        System.out.println ("no data");
      }
    } //while
    System.out.println ("Map size="+oneMap.size());
    myKeys.testEquals();
    myKeys.setAllKeys("Key1_1", "Key2_1", "Key3_1");
    resultData = oneMap.get(myKeys); // Daten zum ersten Schlüssel holen
    System.out.println ("after while: " + myKeys.toString());
    if (resultData != null)
    {
      System.out.println (resultData.toString());
    }
    Set<Map.Entry<AllKeys, Values>> mySet = new LinkedHashSet<Map.Entry<AllKeys, Values>>(); // Ganze Map in Set umkopieren
    mySet = oneMap.entrySet();
    Iterator <Map.Entry<AllKeys, Values>> it = mySet.iterator();
    while (it.hasNext()) // Ganzes Set auslesen
    {
      System.out.println(it.next());
    }
  } //go


  public static void main(String[] args) throws FileNotFoundException, IOException
  {
    HashMapKey prog = new HashMapKey();
    prog.go();
  } //main
} //HashMapKey
 
Ich habe folgenden Code geschrieben:
Java:
    Iterator huelleIter = huelle.keySet().iterator();
    while (huelleIter.hasNext()) {
      String key1 = huelleIter.next().toString();
      Iterator zwischenschichtIter = huelle.get(key1).keySet().iterator();
      while (zwischenschichtIter.hasNext()) {
        String key2 = zwischenschichtIter.next().toString();
        Iterator innenIter = zwischenschicht.get(key2).keySet().iterator();
        while (innenIter.hasNext()) {
          String key3 = innenIter.next().toString();
          String[] value = innen.get(key3);
          System.out.println("["+key1+"]["+key2+"]["+key3+"]["+value[0]+"]["+value[1]+"]");
        }
      }
    }
aber leider bekomme ich diese Ausgabe:
Java:
[Key1_2][Key2_4][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_4][Key3_2][data1_2][data2_2][data3_2]
[Key1_2][Key2_4][Key3_3][data1_3][data2_3][data3_3]
[Key1_2][Key2_4][Key3_4][data1_4][data2_4][data3_4]
[Key1_2][Key2_2][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_2][Key2_2][Key3_3][data1_3][data2_3][data3_3]
[Key1_2][Key2_2][Key3_4][data1_4][data2_4][data3_4]
[Key1_2][Key2_3][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_3][Key3_2][data1_2][data2_2][data3_2]
[Key1_2][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_2][Key2_3][Key3_4][data1_4][data2_4][data3_4]
[Key1_2][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_1][Key3_2][data1_2][data2_2][data3_2]
[Key1_2][Key2_1][Key3_3][data1_3][data2_3][data3_3]
[Key1_2][Key2_1][Key3_4][data1_4][data2_4][data3_4]
[Key1_1][Key2_4][Key3_1][data1_1][data2_1][data3_1]
[Key1_1][Key2_4][Key3_2][data1_2][data2_2][data3_2]
[Key1_1][Key2_4][Key3_3][data1_3][data2_3][data3_3]
[Key1_1][Key2_4][Key3_4][data1_4][data2_4][data3_4]
[Key1_1][Key2_2][Key3_1][data1_1][data2_1][data3_1]
[Key1_1][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_1][Key2_2][Key3_3][data1_3][data2_3][data3_3]
[Key1_1][Key2_2][Key3_4][data1_4][data2_4][data3_4]
[Key1_1][Key2_3][Key3_1][data1_1][data2_1][data3_1]
[Key1_1][Key2_3][Key3_2][data1_2][data2_2][data3_2]
[Key1_1][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_1][Key2_3][Key3_4][data1_4][data2_4][data3_4]
[Key1_1][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_1][Key2_1][Key3_2][data1_2][data2_2][data3_2]
[Key1_1][Key2_1][Key3_3][data1_3][data2_3][data3_3]
[Key1_1][Key2_1][Key3_4][data1_4][data2_4][data3_4]
[Key1_4][Key2_4][Key3_1][data1_1][data2_1][data3_1]
[Key1_4][Key2_4][Key3_2][data1_2][data2_2][data3_2]
[Key1_4][Key2_4][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_4][Key3_4][data1_4][data2_4][data3_4]
[Key1_4][Key2_2][Key3_1][data1_1][data2_1][data3_1]
[Key1_4][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_4][Key2_2][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_2][Key3_4][data1_4][data2_4][data3_4]
[Key1_4][Key2_3][Key3_1][data1_1][data2_1][data3_1]
[Key1_4][Key2_3][Key3_2][data1_2][data2_2][data3_2]
[Key1_4][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_3][Key3_4][data1_4][data2_4][data3_4]
[Key1_4][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_4][Key2_1][Key3_2][data1_2][data2_2][data3_2]
[Key1_4][Key2_1][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_1][Key3_4][data1_4][data2_4][data3_4]
[Key1_3][Key2_4][Key3_1][data1_1][data2_1][data3_1]
[Key1_3][Key2_4][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_4][Key3_3][data1_3][data2_3][data3_3]
[Key1_3][Key2_4][Key3_4][data1_4][data2_4][data3_4]
[Key1_3][Key2_2][Key3_1][data1_1][data2_1][data3_1]
[Key1_3][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_2][Key3_3][data1_3][data2_3][data3_3]
[Key1_3][Key2_2][Key3_4][data1_4][data2_4][data3_4]
[Key1_3][Key2_3][Key3_1][data1_1][data2_1][data3_1]
[Key1_3][Key2_3][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_3][Key2_3][Key3_4][data1_4][data2_4][data3_4]
[Key1_3][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_3][Key2_1][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_1][Key3_3][data1_3][data2_3][data3_3]
[Key1_3][Key2_1][Key3_4][data1_4][data2_4][data3_4]

anstatt die folgend richtige Ausgabe:
Java:
[Key1_1][Key2_1][Key3_1][data1_1][data2_1][data3_1]
[Key1_2][Key2_2][Key3_2][data1_2][data2_2][data3_2]
[Key1_3][Key2_3][Key3_3][data1_3][data2_3][data3_3]
[Key1_4][Key2_4][Key3_4][data1_4][data2_4][data3_4]

Der komplette Code sieht wie folgt aus:
Java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;

public class HashMapKey {

  public static void main(String[] args) throws FileNotFoundException, IOException {
    String fastaFile = "inputData.txt";

    BufferedReader br = new BufferedReader(new FileReader(fastaFile));

    HashMap<String, HashMap<String, HashMap<String, String[]>>> huelle =
            new HashMap<String, HashMap<String, HashMap<String, String[]>>>();
    HashMap<String, HashMap<String, String[]>> zwischenschicht =
            new HashMap<String, HashMap<String, String[]>>();
    HashMap<String, String[]> innen =
            new HashMap<String, String[]>();

    String strLine;
    while ((strLine = br.readLine()) != null) {

      String[] line = strLine.replaceAll(" ", "").trim().split(",");

      for (int i = 0; i < line.length; i++) {
        System.out.print("[" + line[i] + "]");
      }

      innen.put(line[2], new String[]{line[3], line[4], line[5]});
      zwischenschicht.put(line[1], innen);
      huelle.put(line[0], zwischenschicht);

      System.out.println();
    }


    System.out.println();
    Iterator huelleIter = huelle.keySet().iterator();

    while (huelleIter.hasNext()) {
      String key1 = huelleIter.next().toString();
      Iterator zwischenschichtIter = huelle.get(key1).keySet().iterator();
      while (zwischenschichtIter.hasNext()) {
        String key2 = zwischenschichtIter.next().toString();
        Iterator innenIter = zwischenschicht.get(key2).keySet().iterator();
        while (innenIter.hasNext()) {
          String key3 = innenIter.next().toString();
          String[] value = innen.get(key3);
          System.out.println("["+key1+"]["+key2+"]["+key3+"]["+value[0]+"]["+value[1]+"]["+value[2]+"]");
        }
      }
    }
  }
}

Was habe ich falsch gemacht?
 

Neue Themen


Zurück
Oben