HashMap i pewien rodzaj obiektu

0

Mam taki problem: mam klasę która posiada pole klucz i pole wartość. Potrzębuje do niej jakiegoś kontenera, który wyszukiwał by mi obiekty tej klasy na podstawie klucza. W C++ użył bym zwykłego seta z odpowiednim komparatorem. Niestety w Javie kontenera Set nie mogę użyć ponieważ nie udostępnia on metody, którą mógłbym się dobrać do elementu o danym kluczu (mogę tylko sprawdzić czy jest taki element). Musiałbym użyć kontenera Map, ale tu z kolei trzeba by powielać wartość klucza (klucz był by jednocześnie w Key jako String i w Value jako cała klasa). Czy ktoś może wie jak można w miarę elegancko rozwiązać mój problem ?

0

sprobuj poczytaj o java.util.TreeSet - podajesz Comparatora w konstruktorze

0

TreeSet niestety również mnie nie nie urządza, ponieważ nie posiada metody która by mi zwróciła obiekt o podanym kluczu.

0

Skoro klucz jest równoważny obiektowi to możesz spokojnie napisać własnego generics'a:

import java.util.LinkedList;
import java.util.List;

public class OwnGenericsExample {

	public static void main(String[] args) {
		MyGener<MyObj> mg = new MyGener<MyObj>();
		MyObj mo1 = new MyObj();
		mo1.key = "a";
		mo1.value = "a1";
		MyObj mo2 = new MyObj();
		mo2.key = "b";
		mo2.value = "b2";
		
		mg.put(mo1).put(mo2);
		
		System.out.println(mg.get("a").value);
		System.out.println(mg.get("b").value);
	}

}

class MyObj{
	public String key;
	public String value;
	
}

@SuppressWarnings("hiding")
class MyGener<T extends MyObj>{
	List<T> myObj = new LinkedList<T>();
		
	public T get(String key){
		for(T mo : myObj){
			if(mo.key.equals(key))
				return mo;
		}
		return null;
	}
	
	public MyGener<T> put(T myObj){
		this.myObj.add(myObj);
		return this;
	}
}

Oczywiście klucz i wartość prywatne i setterty i gettery, metoda put() może też zwracać void. Cała sztuka polega na tym, że niejawnie, za pomocą własnego obiektu, przesłaniasz listę. Można jeszcze na co najmniej sześć, siedem sposobów rozwiązać ten problem, ale wszystkie te rozwiązania sprowadzą do używania list lub tablic. Ten przykład jest mocno okrojony, ale główny sens jest znany napisz samemu :)

0

Gdy używam listy, to czas dostępu do elementu mam O(n). Używając HashMapów mam stały a jednocześnie wolałbym uniknąć pisania własnego HashSeta.

0

Czy chcesz przechowywać same napisy?
Jeżeli tak, to HashSet będzie idealny.
W Javie i tak nie można "dobrać się" do napisu - raz stworzonego napisu nie można zmieniać.
http://java.sun.com/javase/6/docs/api/java/lang/String.html

Jeżeli natomiast chcesz przechowywać obiekty, których kluczami są napisy, to wybierz HashMap.
I nie przejmuj się, że ten sam napis będziesz mieć dwa razy - klasa String utrzymuje zbiór wszystkich napisów i w pamięci tak naprawdę będzie tylko jeden napis. (poczytaj o metodzie string.intern() jeżeli chcesz się o tym przekonać)

1 użytkowników online, w tym zalogowanych: 0, gości: 1