2013-05-13 22 views
5

Chcę mapę opon jak cios:Jak zaimplementować mapę opon w języku Java?

Map<String,Object> map = new TireMap(); 
map.put("com","1"); 
map.put("com.aa","2"); 
map.put("com.aa.bb","3"); 

map.get("com");// return ["1","2","3"] 
map.get("com.a"); //return ["2","3"] 
map.get("com.aa"); //return ["2","3"] 
// the key maybe full key or just key prefix 

Jak wdrożyć mapę takiego? Czy już istnieje mapa w Java API lub open source?

To jest bardzo podobne do innodb w mysql.

PS:Performance jest bardzo ważne. Elementy do przechowywania będą miały więcej niż 1000W.

+0

czy masz limit liczby warstw? – Peeyush

+0

Limit i ograniczenie @Peeyush są w porządku. jeśli limit, numer ograniczenia może zostać zmieniony. – lichengwu

Odpowiedz

5

Chciałbym wypróbować TreeMap z java.util. To jest mapa, która robi to, czego potrzebujesz. Zarządza kluczami w oparciu o porządek naturalny (zdefiniowany przez comparator w klasie klucza). Metody tailMap i headMap udostępniają mapę z kluczami, których potrzebujesz.

Przykład

public static void main(String[] args) { 
    TreeMap<String, Object> map = new TreeMap<String, Object>(); 

    map.put("com","1"); 
    map.put("com.aa","2"); 
    map.put("com.aa.bb","3"); 

    System.out.println(map.get("com")); 
    System.out.println(map.tailMap("com").values()); // ["1","2","3"] 

    System.out.println(map.get("com.aa")); //return ["2","3"] 
    System.out.println(map.tailMap("com.aa").values()); 
} 
+0

dzięki, TreeMap brzmi świetnie! – lichengwu

0

Oto co zaimplementowałem, aby rozwiązać problem, ale nie jestem pewien co do wydajności, którą należy znaleźć.

class TireMap extends HashMap<String, Object> { 

@Override 
public Object get(Object key) { 
    // TODO Auto-generated method stub 
    List<Object> listOfObejcts = new ArrayList<Object>(); 

    String keyString = (String) key; 

    for(String s : this.keySet()){ 

     if(s.startsWith(keyString)) 
      listOfObejcts.add(super.get(s)); 
    } 

    return listOfObejcts; 
} 
} 


public class Test 
{ 
    public static void main(String args[]) { 

    Map<String, Object> map = new TireMap(); 

    map.put("com", "1"); 
    map.put("com.aa", "2"); 
    map.put("com.bb", "3"); 


    System.out.println(map.get("com")); 
    System.out.println(map.get("com.aa"));` 
} 

ta zwraca mi ["1","2","3"] i ["2","3"] odpowiednio. Sprawdź to proszę.

+0

klawisz może być pełny klucz lub po prostu klucz prefiks. '.' nie jest separatorem klucza. – lichengwu

+0

, że dzielenie nie jest wymagane, nie użyłem go. SO zredagował odpowiedź. – Joshi

+0

za każdym razem, gdy wywoływany jest 'public Object get (Object key)', będzie on iterować wszystkie klucze, więc wydajność twojej metody nie jest zbyt dobra? – lichengwu

0

realizacja najczęściej używanych MAP w Java HashMap lub TreeMap (wydajność zależy od tego, co zrobić z mapą (dodawanie danych, czytać, to dane musiały być klasyfikowane ...)), jeśli wszystko było ok, po prostu musisz zrobić to bezpośrednio w mapowaniu (nie rozszerzaj HashMap, ponieważ rozszerzasz wszystkie metody i tylko odnawiasz metodę zdefiniowaną w twojej implementacji

przeczytaj dokument, aby poznać lepiej implementacja mapy, która już istnieje w Javie, lub po prostu użyj klasycznej implementacji, aby zacząć rozwijać swoją aplikację z

Map<String,Object> map = new TreeMap(); 

i jeśli chcesz zmienić realizację trzeba po prostu zrobić to, co chcesz, który implementuje mapsand zmienić swój kod w $

Map<String,Object> map = new YourMapImplementation(); 

ps Joshi: Bądź carrefull, w kodzie, klucz jest obiektem i nie musi być porównywalny, może dostarczyć trochę błędu, jeśli popełni błąd

+0

Jak podano w pytaniu, a także wymienione w mojej odpowiedzi, kluczem mapy nie jest żaden obiekt "Object", a raczej jego obiekt "String" – Joshi

Powiązane problemy