Speichermöglichkeit gesucht

magic_halli

Erfahrenes Mitglied
Hi,

ich möchte gewisse Werte (double) und Strings gern in einer Art Tabelleformat abspeichern, um dann später mittels for-Schleife diese wieder auszulesen. Ich bin mir noch nicht ganz sicher, ob noch ein Index für jede Zeile später gebraucht wird (um evtl. mittels bekannter Indexposition zuzugreifen)!
Es sollte ungefähr so gespeichert werden (Variante 1):
Code:
String1     5
String2     6
String3     2
usw.
...oder die Möglichkeit mit Index (Variante 2):
Code:
0     String1     5
1     String2     6
2     String3     2
usw.
Welche Möglichkeiten kann ich für die beiden Varianten am besten nutzen (ArrayList, HashMap etc.?)?

Danke und Gruß.
 
Hallo,

ich würde hier ne Map nehmen. Wenn die Einfüge-Reihenfolge der Elemente beim auslesen berücksichtigen willst musst du eine LinkedHashMap nehmen (dann könntest du auch über einen trick [entsprechend viele entries bis zum Index skippen] per index auf den entsprechenden Entry zugreifen). Ansonsten tut's auch die normale HashMap

Java:
/**
 * 
 */
package de.tutorials;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author Thomas.Darimont
 */
public class MapExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    Map<String, Double> map = new LinkedHashMap<String, Double>(); // new HashMap<String,
                                                                    // Double>();
    for (int i = 0; i < 20; i++) {
      map.put("Entry" + i, (double) i);
    }

    for (String entry : map.keySet()) {
      System.out.printf("%s: %s\n", entry, map.get(entry));
    }
  }

}

Gruß Tom
 
Hi,

Ist Deine Frage, welche Datenstruktur Du am Besten zum Abspeichern der Tabelleninhalte benutzen kannst? :confused:

Wenn ja würde mir spontan ein zweidimensionales Array, bzw. ArrayList einfallen.
 
Mh, ich hab mich erstmal für ne Map bzw. HashMap entschieden. (Die Einfüge-Reihenfolge der Elemente beim auslesen brauchen nicht berücksichtigt werden!) Nur leider kann ich irgendwie keine Paare von String,double darin abspeichern. Immer wieder bekomme ich die Meldung: "... is not applicable for the arguments (String, double)"
Hier mal mein Code:
Java:
String[] sParam    //ist bereits mit Strings gefüllt
HashMap hmParamValues = new HashMap();

//für jeden Stringwert den entspr. double-Wert suchen und paarweise speichern
for(int i = 0; i < sParam.length; i++){
     //hier auslesen von Parametern aus einem Programm - geht!
     Parameter param = model.GetParam(sParam[i]);
     //hier erhalte ich die entspr. double-Werte zu den Strings - geht!
     double param_value = param.GetValue().GetDoubleValue();
     //in HashMap speichern - geht nicht - Fehlermeldung!
     hmParamValues.put( sParam[i], (double)param_value );
}
Wie bekomme ich die Konstellation String,double in die HashMap gespeichert?

Gruß.
 
Laut API verlangt put als Wert ein Object. Welche Möglichkeiten hast Du also?
1. Selbst eine Klasse bauen, in der Du Deine Werte (String und double) ablegen kannst und Objekte dieser Klasse in der HashMap speichern.
2. Eine HashMap für jeden zu verwaltenden Wert anlegen (eine für alle Strings, eine für alle double).
 
So, ich hab jetzt 2 HashMaps angelegt - einmal für die Stringwerte und einmal für die double-Werte:
Java:
for(int i = 0; i < sParam.length; i++){
     //Parameter param = model.GetParam(sParam[i]);
     //double param_value = param.GetValue().GetDoubleValue();

     hmParamString.put(sParam[i], new Integer(i));
     hmParamDouble.put( model.GetParam(sParam[i]).GetValue() , new Integer(i) );
}
Ok, jetzt hab ich aber 2 getrennte HashMaps in denen einmal der String und zum anderen der zugehörige double-Wert drin ist.
Ich will aber eigentlich den String und zugehörigen double-Wert in einer Map oder Liste oder sonstwas, quasi in einer Zeile, nebeneinander stehen haben, um später einfach zeilenweise auszulesen und das entsprechende Wertepaar zu erhalten.

Nun hab ich mir gedacht, ob es möglich ist, diese 2 HashMaps zu einer zu vereinen, damit ich mein Vorhaben durchbringen kann. Das scheint aber nicht zu funktionieren?
...Denn eine 3.HashMap, welche quasi aus den 2 erzeugten HashMaps besteht, geht ja wohl nicht?! In etwa so?:
Java:
...
hmParamValues.put(hmParamString, hmParamDouble);

Wie bekomme ich im Endeffekt meine Strings und doubles so abgespeichert, wie im 1.Post beschrieben?
bspw:
Code:
String1     5
String2     6
String3     2
 
So, ich hab das jetzt doch alles in eine HashMap gepackt. Nun ist mir nur noch nicht ganz klar, wie ich die String-double-Paare dann paarweise auslesen kann.
Java:
//wird übergeben - hier sind die Strings drin
String[] sParam;

HashMap hmParamValues = new HashMap();

for(int i = 0; i < sParam.length; i++){
     //hinter model.GetParam(sParam[i]).GetValue() sind die zugehörigen double-Werte zum String - funktioniert auch!
     //Speicherung der jeweiligen String-double-Paare in die HashMap
     hmParamValues.put(sParam[i], model.GetParam(sParam[i]).GetValue());

     //Testausgabe der Strings und doubles - ist korrekt!
     JOptionPane.showMessageDialog(null, "String:"+sParam[i]+" double="+model.GetParam(sParam[i]).GetValue().GetDoubleValue());
}
//gibt die Länge der HashMap aus - ist auch korrekt für mein Testszenario!
JOptionPane.showMessageDialog(null, "hmParamString-Size="+hmParamValues.size());

//auslesen der String-double-Paare
Iterator iter = hmParamValues.keySet().iterator();
while(iter.hasNext()){
     //nur wie jetzt auslesen?
}
 
So gehts einfacher:

Java:
//auslesen der String-double-Paare
for (String key: hmParamValues.keySet()) {
  System.out.println(key + " => " + (double)hmParamValues.get(key));

Aber bau Dir doch eine eigene Klasse, die sämtliche Attribute eines Eintrags enthält. Und Objekte dieser Klasse legst Du dann in der HashMap ab.
 
Paarweise auslesen geht mit:

Java:
for(Iterator it = map.entrySet().iterator(); it.hasNext();){
    Map.Entry entry = (Map.Entry) it.next();
    Object key = entry.getKey();
    Object value = entry.getValue();
    System.out.println(key + " " + value);
}

Trotzdem halte ich das für keine so schöne Lösung. Wenn einmal zwei gleiche Strings vorkommen werden z.B. die zugehörigen doubles überschrieben.

Einfacher wäre es dir eine eigene Datenstruktur zu machen:

Java:
public class MyData {
      private String strg;
      private double value;
      
      public MyData(String strg, double value){
         this.strg = strg;
         this.value = value;
     }

     //getter.......
}

Und dann entsprechend neue Datenobjekte in einer Liste ablegen:

Java:
List lst = new ArrayList();
lst.add(new MyData(strg,5.0));

//Auslesen
for(Iterator it = lst.iterator(), it.hasNext();){
    MyData data = (MyData) it.next();
    System.out.println(data.getStrg() + " " + data.getValue());
}
 
Zurück