2013-08-11 2 views
2

일반적으로 사람들은 키가 enum 일 때 EnumMap을 사용해야한다고 말합니다. 하지만이 사건에 대해 각 enum 값의 빈도를 계산하려면 어떻게해야합니까? 그것은 trove4j TObjectIntHashMap이 코드에서 더 나은 것처럼 보입니다.Trove4j TObjectIntHashMap 대 EnumMap <Enum, Integer>

다음 trove4j 컬렉션 예이다

가 EnumMap는 경우
TObjectIntMap<ExtraOperator> extraOpr = new TObjectIntHashMap<ExtraOperator>(); 
extraOpr.adjustOrPutValue(ExtraOperator.ternary, 1, 1); 

코드 보이는 같은

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

따라서 trove4j 검사 존재 내부적 수 자동 증가 값 이것은 코드를보다 간결하게 만든다. EnumMap은 enum을 키로 사용하여 성능이 향상되지만 Integer (boxing 및 unboxing)의 검색 및 증가도 비용이 소요됩니다.

낮은 메모리 비용과 빠른 속도를 고려할 때 어느 것이 더 좋을까요?

+0

'EnumMap'을 덮어 쓰거나 감싸면 코드가 간결 해집니다. 'EnumMap'은'Enum'을 위해 최적화되어 있기 때문에 거의 확실합니다. 'Trove' 맵은 일반적인'Object'를위한 맵핑이므로 최적화가 없습니다. –

+0

@BoristheSpider 같은 인수로, Trove는'int' 값에 최적화되어 있고 래퍼가 필요합니다. 어떤 유스 케이스가 더 나은지를 결정하기 위해 테스트해야 할 것이다. 나는 배열이 어느 쪽보다 낫다고 믿는다. –

+0

@ PeterLawrey 물을 보유하고 있다고 생각하지 않습니다. 나는 해싱과 조회 비용이 위성 데이터의 저장 시간이 아니라고 생각한다. ... –

답변

3

저렴한 비용/빠른 속도를 원할 경우 일반 배열을 사용할 수 있습니다.

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

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

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

영리한, 확실히 최소한의 오버 헤드가 있습니다. –