【问题标题】:Enum as key of HashTable枚举作为 HashTable 的键
【发布时间】:2012-03-02 11:12:55
【问题描述】:

我正在用 Java 编写 Schedule 结构。 我有一个哈希表,其中枚举 Day 作为键,时间范围列表作为值。 像这样:

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

private Hashtable<Day,TimeRanges> _applyCalendar; 

TimeRanges 类在哪里...

public class TimeRanges implements List<TimeRange> {

当我向 _appleCalendar 添加元素时,我会这样做:

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

}

我的问题是方法 contains() 不能正常工作。 HashTable 无法在 hashtable 中找到现有元素,始终进入第一个条件:S

有没有什么方法可以做到这一点,而不应该将 Day 声明为类并实现 comareTo() ??

【问题讨论】:

  • 你为什么要使用Hashtable
  • 使用枚举键,您还可以选择使用(经常被忽视的)EnumMap,它由数组支持,所有操作都是常数时间。并不是说它在这里会有所作为,但也不会花费任何费用。

标签: java collections hashtable


【解决方案1】:

我认为您想使用.containsKey() 而不是contains()contains() 将搜索实际对象,而 containsKey() 将搜索键。

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

}

【讨论】:

  • 很好的说明为什么永远不要使用古老的Hashtable 类!
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2014-02-16
相关资源
最近更新 更多