Wertepaar speichern

Otz

Bekanntes Mitglied
Hallo zusammen,

ich habe eine kleine Frage und bräuchte mal eure Hilfe.
Ich habe einige Wertepaare bestehend aus zwei Strings die ich speichern möchte.
Beispiel:
Attribut1 Wert1
Attribut2 Wert2
Attribut2 Wert3
Attribut2 Wert4
...

Mit welcher Datenstrucktur macht man sowas am besten?

Was haltet ihr von einer Hashtable in die ich als key das attribut reinlege und die verschiedenen werte als liste oder ähnliches ablege?!

danke im voraus
 
Zuletzt bearbeitet:
Hashmap z.B

o. Hashtable, kommt halt drauf an was genau du in der list hinterlegen willst und genau du mit den werten später machen möchstest
 
Zuletzt bearbeitet:
Wenn du von mehreren threads aus auf die liste zugreifen musst nutze hashtable da diese synchronized ist, falls du nur einen thread haben solltest dann nimm die hashmap da diese durch die nicht notwendige synchronisation etwas performanter ist 🙂
 
ok vielen dank.

ich erkläre euch mal noch auf die schnelle was ich machen möchte!


also ich habe eine menge an datensätzen mit verschiedenen attributen. z.b. bilder und videos.
diese daten haben verschiedene attribute z.b. größe, aufnahmedatum, ...

jetzt möchte ich mir eine art suchoberfläche dafür erstellen die mir alle attribute zur eingrenzung als filter auflistet. und je nachdem was ich auswähle möchte ich eine ergebnismenge immer weiter eingrenzen.


also mache ich mir eine hashtable in der ich als key das aufnahmedatum schreibe und als value eine liste mit allen aufnahmedatums und das für jedes attribut. diese attribute können dann vom nutzer ausgewählt werden und fließen dann in die ergebnissmenge mit ein.

würdet ihr das immer noch mit einer hashtable machen oder bietet sich hierfür etwas anderes besser an?!
 
In dem Fall kannst du auch eine ArrayList nehmen. Jeder Eintrag in der Liste ist dann ein Wertepaar(dafür müsstest du dann eine Wertepaar Klasse erstellen).
Um doppelte Einträge zu vermeiden kannst du ein HashSet verwenden.
Du erstellst ein leeres HashSet, gehst durch sämtliche Einträge, die ausgewählt wurden und verwendest die HashSet.addAll Methode um alle Bilder des aktuellen Attributes hinzuzufügen.
Oder mathematisch ausgedrückt - du erstellst du Schnittmenge aller Mengen an Bildern, die zu den ausgewählten Attributen gehören.
 
Warum erstellst du die Hashmap/table nicht einfach mit einer referenz auf den Dateinamen deins Bildes ?

weil er nicht das bild braucht sondern die verschiedenen werte der einzelnen Attribute... oder?

Im Grunde wäre eine HashMap mit einem Set darin passend...

zb so...

Java:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;


public class Person {
	
	private String vorname;
	private String nachname;
	

	private Person(String vorname, String nachname) {
		super();
		this.vorname = vorname;
		this.nachname = nachname;
	}

	
	
	public String getVorname() {
		return vorname;
	}

	public void setVorname(String vorname) {
		this.vorname = vorname;
	}

	public String getNachname() {
		return nachname;
	}

	public void setNachname(String nachname) {
		this.nachname = nachname;
	}


//ab hier sollte das natürlich in eine andere klasse, aber da bin ich jetzt zu faul..
	private static Map<String, Set<String>> attributes = new HashMap<String, Set<String>>();
	
	public static void main(String[] args) {
		List<Person> personen = new ArrayList<Person>();
		personen.add(new Person("Franz", "Huber"));
		personen.add(new Person("Josef", "Huber"));
		personen.add(new Person("Josef", "Müller"));
	
		for(Person p: personen){
			addValue("Vorname", p.getVorname());
			addValue("Nachname", p.getNachname());
		}
		
		
		System.out.println("Vorhandene Werte...");
		for(String attribute : attributes.keySet()){
			System.out.println(attribute);
			for(String value : attributes.get(attribute)){
				System.out.println(" "+value);
			}
		}		
	}
	
	public static void addValue(String attribute, String value){
		Set<String> values = attributes.get(attribute);
		if(values == null){
			values = new HashSet<String>();
			attributes.put(attribute, values);
		}
		values.add(value);
	}
}
 
Zuletzt bearbeitet:
hab mich heute morgen nochmals bischen mit diesem problem beschäftigt und glaube, dass deine lösung wirklich ganz passend ist.

jedoch stehe ich jetzt vor einem weiterem problem bei dem ich euren rat bräuchte :autsch:

nehmen wir an: ich habe jetzt von 100 bildern die attribute wie z.b. aufnahmedatum, größe... in einer hashmap gespeichert. jetzt wählt der nutzer über die gui ein bestimmtes aufnahmedatum aus, nach dem er filtern möchte. also er möchte nur bilder angezeigt bekommen, die an diesem aufnahme datum erstellt wurden.

muss ich da jetzt wieder meine komplette ergebnissmenge durchgehen und jedes mal das datum überprüfen? oder gibt es da irgendeine andere möglichkeit dies irgendwie schneller zu erledigen?!
 
Genau das ist der Zweck der HashMap.
Die Attribute (z.B. Aufnahmedatum) sind die Schlüssel der HashMap und die Bilder die Werte, nicht umgekehrt.
 

Neue Themen


Zurück
Oben