2010-12-06 7 views
1

Je crée un Flyweight en Java, et je veux m'assurer que je ne crée pas une carte trop grande. Y a-t-il un moyen plus efficace d'élaguer la carte? Je n'ai vu aucune propriété qui pourrait le faire automatiquement (comme un constructeur de taille max), donc je le fais dans le code.Un moyen efficace d'élaguer HashMap

Voici ce que j'ai, son assez basique, mais je veux vous assurer qu'il n'y a pas une meilleure façon:

private static void prune() { 
    Iterator<Entry<Integer, Integer[]>> iterator = seeds.entrySet().iterator(); 
    int removed = 0; 
    while(iterator.hasNext()|| removed == pruneLength) { 
     iterator.next(); 
     iterator.remove(); 
     removed++; 
    } 
} 
+0

Voulez-vous dire que vous essayez d'éviter une carte qui a une large gamme de clés ou? –

+2

Pourquoi ne pas utiliser 'iterator.remove()'? Cela renvoie sur la carte. –

+0

Je veux limiter la croissance de ces cartes au fil du temps. Je ne devrais pas atteindre cette limite souvent ... – Nix

Répondre

5

LinkedHashMap peut être utilisé comme cache LRU.

Map<Integer, Integer[]> map = createLRUMap(128); 

public static <K, V> Map<K, V> createLRUMap(final int maxSize) { 
    return new LinkedHashMap<K,V>(maxSize, 1, true) { 
     @Override 
     protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { 
      return size() > maxSize; 
     } 
    }; 
} 
+0

Je teste celui-ci maintenant. – Nix

+0

il utilise le code intégré/testé, et il implémente LRU très simplement. –

+0

Opps, bug léger car il enlèvera le dernier élément quand il correspondait à la taille maximum plutôt quand il était plus grand que la taille maximum. –

1

Avez-vous envisagé d'utiliser des caches, EhCache par exemple? Ils implémentent des cartes et déclarent que vous pouvez définir la taille, la limite après que les valeurs sont stockées sur un disque, etc.

+0

Ceci est un joli petit projet, je ne pense pas qu'il soit nécessaire de le prendre au niveau EhCache. Merci pour la suggestion si ... je garderai cela à l'esprit pour les futurs projets. – Nix

+0

ehcache est une très belle bibliothèque. Cependant, je préfère toujours commencer simple si possible. –

3

Guava « s MapMaker a cela dans sa dernière version (sur le tronc). Ça devrait être en r08, mais je ne sais pas quand ça sort exactement. Notez qu'il s'agit d'une mappe simultanée sans danger pour les threads, ce qui peut sembler important selon la façon dont vous l'utilisez.

+0

'// MapMaker, MapMaker, faites-moi une carte ...' –

0

Une possibilité du monde des bases de données est d'avoir deux (ou potentiellement plus de cartes). Les recherches utilisent les deux cartes. Écrit à juste un. Lorsque celui en cours d'écriture atteint sa capacité, remplacez/effacez la carte en lecture seule et basculez.

Questions connexes