PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java HashMap mit eigener Klasse als Value


mobius
2012-12-16, 22:28:59
Nabend Forum,

muss für ne Studienaufgabe mit Hashmaps arbeiten und komme nicht weiter. Ich habe eine eigene Klasse "Klassifikation" die folgendermaßen aussieht:
public class Klassifikation {

@Id
private String idcl;
private String identifier;
private String versionnumber;
private String publicationdate;
...
Getter/Setter alle da.

Die Hashmap sieht so aus:
Map<String, Klassifikation> hashmap = new HashMap<String, Klassifikation>();

Diese wird mit Daten aus einer CSV gefüllt, nach dem Schema:
getHashmap().put(lineSplit[0], new Klassifikation(lineSplit));
In lineSplit steht eine Zeile aus dem CSV.

Im Hauptprogramm möchte ich durch alle Hashmapeinträge gehen:
for (int i = 0; i<csvKlassifikation.getHashmap().size();i++)
{
if (csvKlassifikation.getHashmap(). //problem
}

Ich würde gerne an dieser Stelle beim aktuellen Hashmapeintrag auf beispielsweise idcl zugreifen. Geht das? Falls ja, wie? Ich steig da grad gar nicht durch.

Berni
2012-12-16, 23:00:20
Du musst das über einen Iterator lösen. So in der Art sollte das gehen
Iterator<Klassifikation> it = csvKlassifikation.getHashmap().entrySet().iterator();
while(it.hasNext()) {
Klassifikation tmp = it.next();
System.out.println(tmp.idcl);
}
Aber Achtung: Bei einem großen HashSet ist das Iterieren recht langsam (bzw. das Erstellen des entrySets). Man sollte dann über andere Lösungen nachdenken wenn man Performanceprobleme feststellt.

RattuS
2012-12-16, 23:19:35
for (Map.Entry<String, Klassifikation> entry : map.entrySet()) {
String key = entry.getKey();
Klassifikation value = entry.getValue();
}

mobius
2012-12-16, 23:26:13
Danke Jungs, das funktioniert wirklich tadellos. Auf euch kann man sich verlassen.

Ich soll es bewusst so lösen, um die Performance zu testen. Mal gucken was am Ende rauskommt ^^.

PatkIllA
2012-12-17, 21:40:55
Aber Achtung: Bei einem großen HashSet ist das Iterieren recht langsam (bzw. das Erstellen des entrySets). Man sollte dann über andere Lösungen nachdenken wenn man Performanceprobleme feststellt.Sicher dass das umkopiert wird?
Die Doku liest sich da anders. Bei der ziemlich ähnlichen Klasse Dictionary<TKey, TValue> von .NET wird definitiv auch nicht umkopiert.
Returns a Set view of the mappings contained in this map. The set is backed by the map, so changes to the map are reflected in the set, and vice-versa. If the map is modified while an iteration over the set is in progress (except through the iterator's own remove operation, or through the setValue operation on a map entry returned by the iterator) the results of the iteration are undefined. The set supports element removal, which removes the corresponding mapping from the map, via the Iterator.remove, Set.remove, removeAll, retainAll and clear operations. It does not support the add or addAll operations.

Berni
2012-12-17, 22:45:36
Hmm...du hast natürlich Recht. Hatte das falsch in Erinnerung weil ich das mal so implementiert habe. Die Problematik ist wenn man parallel schreibend/lesend auf so eine HashMap zugreift. Da bleibt dir dann nur das Arbeiten mit ner Kopie des der HashMap zugrundeliegenden Arrays (oder man locked lange). Wird ja auch so angemerkt dass man ansonsten undefined results kriegt.

Iterieren kann jedenfalls relativ langsam sein - abhängig von den freien Buckets in der HashMap. Wenn man viel iteriert sollte man überlegen, ob die Datenstruktur so in Ordnung ist (=> LinkedHashMap oder es gibt auch alternative Collection-Frameworks).