2012-02-09 4 views
5

Sto scrivendo una struttura di pianificazione in Java. Ho un Hashtable con enum Day come chiave ed elenco di timeranges come valore. Ti piace questa:Enum come chiave di HashTable

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

private Hashtable<Day,TimeRanges> _applyCalendar; 

dove la classe TimeRanges è ...

public class TimeRanges implements List<TimeRange> { 

Quando aggiungo elementi per _appleCalendar faccio questo:

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

} 

Il mio problema è il metodo contiene() doesn funziona bene HashTable non può essere in grado di fondare elemento esistente nella tabella hash, tutto il tempo entra nella prima condizione: S

Esiste un modo per fare questo senza dovrebbe dichiarare giorno di classe e implementare comareTo() ??

+4

Perché stai utilizzando 'Hashtable'? – skaffman

+3

Con i tasti Enum hai anche la possibilità di usare il (spesso trascurato) [EnumMap] (http://docs.oracle.com/javase/6/docs/api/java/util/EnumMap.html), è supportato da un array e tutte le operazioni sono costanti. Non che farebbe la differenza qui, ma non costa nulla, neanche. – Dmitri

risposta

4

Penso che si voglia utilizzare .containsKey() anziché . cercherà gli oggetti reali mentre containsKey() eseguirà la ricerca delle chiavi.

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

Grande illustrazione del perché non usare mai l'antica lezione di Hashtable! –