2013-05-13 14 views
5

Voglio una mappa di pneumatici come colpo:Come implementare la mappa dei pneumatici in 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 

Come implementare una mappa come questo? O esiste già una mappa in Java API o open source?

È molto simile a innodb in mysql.

PS:Performance è molto importante. Gli elementi di archiviazione saranno più di 1000W.

+0

hai un limite sul numero di livelli? – Peeyush

+0

@Peeyush limit e unlimit sono entrambi ok. se limite, il numero limite può essere modificato. – lichengwu

risposta

5

Vorrei provare TreeMap da java.util. Questa è una mappa che fa tutto ciò di cui hai bisogno. Gestisce le chiavi in ​​base a un ordine naturale (definito da comparator nella classe chiave). I metodi tailMap e headMap forniscono una mappa con i tasti necessari.

Esempio

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

grazie, TreeMap suona alla grande! – lichengwu

0

Ecco cosa ho implementato per risolvere il problema, ma non sono sicuro delle prestazioni, che devono essere scoperte.

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"));` 
} 

Questo mi restituisce ["1","2","3"] e ["2","3"] rispettivamente. Si prega di controllare questo.

+0

la chiave potrebbe essere la chiave intera o solo il prefisso chiave. '.' non è il separatore della chiave. – lichengwu

+0

che la divisione non è richiesta in realtà, non l'ho usata. SO modificato la risposta. – Joshi

+0

ogni volta che invochi 'oggetto pubblico get (chiave dell'oggetto)', itererà tutte le chiavi, quindi le prestazioni del metodo non sono molto buone? – lichengwu

0

implementazione della mappa più usato in Java è hashmap o TreeMap (performance dipende di ciò che fate con la mappa (aggiunta di dati, leggere, è i dati necessari per essere ordinati, ...)), se fosse ok basta fare altro devi fare direttamente alla mappa implecation (non estendere HashMap perché estendi tutti i metodi e rispetta solo il metodo definito nella tua implementazione.

leggi il documento per sapere meglio implementazione della mappa che esiste già in Java o usa semplicemente un'implementazione classica per iniziare a sviluppare la tua applicazione con

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

e se si desidera cambiare l'implementazione devi solo fare ciò che si vuole che implementa mapsand modificare il codice in $

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

ps Joshi: Essere carrefull, nel codice, la chiave è un oggetto e non deve essere paragonabile, può essere fornito un bug se commette un errore

+0

Come indicato nella domanda e menzionato anche nella mia risposta, la chiave della mappa non è un qualsiasi oggetto 'piuttosto' il suo oggetto' String' – Joshi