2012-02-09 33 views
5

Tôi đang viết một cấu trúc Lịch biểu trong Java. Tôi có một Hashtable với enum Day là Key và danh sách các timerang là giá trị. Như thế này:Enum là khóa của HashTable

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

private Hashtable<Day,TimeRanges> _applyCalendar; 

nơi TimeRanges lớp là ...

public class TimeRanges implements List<TimeRange> { 

Khi tôi thêm yếu tố để _appleCalendar Tôi làm điều này:

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

} 

Vấn đề của tôi là phương pháp chứa() doesn không làm việc đúng. HashTable không thể tìm thấy phần tử hiện có trong Hashtable, tất cả thời gian nhập trong điều kiện đầu tiên: S

Có cách nào để thực hiện điều này mà không cần khai báo Ngày làm lớp và triển khai comareTo() ??

+4

Tại sao bạn sử dụng 'Hashtable'? – skaffman

+3

Với khóa Enum bạn cũng có tùy chọn sử dụng (thường bị bỏ qua) [EnumMap] (http://docs.oracle.com/javase/6/docs/api/java/util/EnumMap.html), nó được hỗ trợ bởi một mảng và tất cả các hoạt động là thời gian không đổi. Không phải là nó sẽ tạo nên sự khác biệt ở đây, nhưng cũng chẳng tốn kém gì cả. – Dmitri

Trả lời

4

Tôi nghĩ bạn muốn sử dụng .containsKey() thay vì . sẽ tìm kiếm các đối tượng thực tế trong khi containsKey() sẽ tìm kiếm các phím.

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

Minh họa tuyệt vời về lý do tại sao không bao giờ sử dụng lớp 'Hashtable' cổ đại! –

Các vấn đề liên quan