2013-08-11 1 views
2

En général, les gens disent que nous devrions utiliser EnumMap lorsque la clé est une énumération. Mais qu'en est-il de ce cas je veux compter les fréquences de chaque valeur enum, il semble que trove4j TObjectIntHashMap est meilleur dans le code.Trove4j TObjectIntHashMap vs EnumMap <Enum, Entier>

Voici l'exemple avec la collecte de trove4j:

TObjectIntMap<ExtraOperator> extraOpr = new TObjectIntHashMap<ExtraOperator>(); 
extraOpr.adjustOrPutValue(ExtraOperator.ternary, 1, 1); 

En cas de EnumMap, le code ressemble à:

Map<ExtraOperator, Integer> extraOpr = Maps.newEnumMap(ExtraOperator.class); 
if (extraOpr.containsKey(ExtraOperator.ternary)) { 
    extraOpr.put(ExtraOperator.ternary, extraOpr.get(ExtraOperator.ternary) + 1); 
} else { 
    extraOpr.put(ExtraOperator.ternary, 1); 
} 

Ainsi, les contrôles de trove4j existence interne et peut-incrémentation automatique de la valeur , ce qui rend le code plus concis. EnumMap utilise enum car la clé a des performances plus élevées mais la récupération et l'incrément de l'entier (boxing et unboxing) prennent aussi du temps.

Lequel serait le meilleur si nous considérons le coût de mémoire bas et la vitesse rapide?

+0

Le 'EnumMap' est presque certainement plus rapide car il est optimisé pour' Enum's. La carte 'Trove' est pour 'Object's généraux et n'a donc pas ces optimisations. –

+0

@BoristheSpider Par le même argument, Trove est optimisé pour les valeurs 'int' et nécessite des wrappers. Vous devrez tester pour un cas d'utilisation donné afin de déterminer lequel est le meilleur. Je crois qu'un tableau sera meilleur que l'un ou l'autre. –

+0

@PeterLawrey Je ne pense pas que cela retienne l'eau. Je pense que le hachage et la recherche coûtent du temps pas le stockage des données satellites ... –

Répondre

3

Si vous voulez un coût inférieur/plus rapide, vous pouvez utiliser un tableau simple. Remplacer ou encapsuler `EnumMap` et votre code sera plus concis.

static final ExtraOperator[] VALUES = ExtraOperator.values(); 

private final int[] counts = new int[VALUES.length]; 

// to count. 
counts[e.ordinal()]++; 
+0

Clever, a certainement le moins de frais généraux. –