2012-02-09 14 views
5

Escribo una estructura de Programación en Java. Tengo un Hashtable con enum Day as Key y lista de timeranges como valor. De esta manera:Enum como clave de HashTable

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 

private Hashtable<Day,TimeRanges> _applyCalendar; 

donde la clase TimeRanges es ...

public class TimeRanges implements List<TimeRange> { 

Al agregar elementos a _appleCalendar hago esto:

public void addApplyDay(Day day,TimeRanges trs) { 
    if (! _applyCalendar.contains(day)) { 
     _applyCalendar.put(day, trs); 
    } else { 
     for (TimeRange t : trs) { 
      _applyCalendar.get(day).add(t); 
     } 
    } 

} 

Mi problema es el método contains() doesn no funciona bien HashTable no puede ser capaz de encontrar el elemento existente en hashtable, siempre ingrese la primera condición: S

¿Hay alguna manera de hacer esto sin debe declarar Day como clase e implementar comareTo() ??

+4

¿Por qué está usando 'Hashtable' en absoluto? – skaffman

+3

Con las teclas Enum, también tiene la opción de utilizar el (a menudo ignorado) [EnumMap] (http://docs.oracle.com/javase/6/docs/api/java/util/EnumMap.html), está respaldado por una matriz y todas las operaciones son tiempo constante. No es que eso marque la diferencia aquí, pero tampoco cuesta nada. – Dmitri

Respuesta

4

Creo que desea utilizar .containsKey() en lugar de . buscará los objetos reales, mientras que containsKey() buscará las claves.

public void addApplyDay(Day day,TimeRanges trs) { 
    if (! _applyCalendar.containsKey(day)) { // << use containsKey 
     _applyCalendar.put(day, trs); 
    } else { 
     for (TimeRange t : trs) { 
      _applyCalendar.get(day).add(t); 
     } 
    } 

} 
+1

¡Gran ilustración de por qué nunca usar la antigua clase 'Hashtable'! –