我可以使用Value的属性之一作为HashMap中的键<key,value =“”>

时间:2015-11-27 16:27:30

标签: java android

我有一个日历视图小部件,其中的单元格代表每一天。每个单元格都有一个Date对象。 我还有一堆WorkDay对象,它们代表每个日期的工作班次和小时计划。 WorkDay对象中有一个日期。

我想将这些WorkDay对象传递给日历,并且在对日历进行膨胀时,每个单元格应该通过其Date对象检查哪个工作日属于它。

我不想预先处理WorkDay对象组,我想改用密钥。

我的问题是,如果我决定使用HashMap来存储工作日, 我可以使用WorkDay的内部Date对象作为每个HashMap条目的键吗?

喜欢这样

hashMap.put(workDay.getDate(), workDay);

如果这不是一个好主意,我应该使用什么数组/列表/集合/地图结构来存储WorkDay对象?

3 个答案:

答案 0 :(得分:3)

从技术上讲,使用Date作为HashMap的键是没有问题的,但从设计的角度来看,您可能希望使用Long表示ms中的时间。

这样做,您的代码变为Date格式不可知(dd.MM.yyyyyy.MM.dd G 'at' hh:mm:ss z等...),而不仅仅是存储紧凑的Object键(Long)你的地图。

然后,您还可以将此值转换回您想要的任何类型的对象,例如Calendar,java Date,joda time等。

将它存储在数据库,平面文件系统或您正在使用的任何持久性中也更容易。

答案 1 :(得分:0)

您可以将Date对象用作HashMap中的密钥,是否会覆盖equals()hashCode()方法。

来自HashMap课程文档:

  

更正式地说,如果此映射包含从键k到值v的映射,使得(key == null?k == null:key.equals(k)),则此方法返回v;否则返回null。 (最多可以有一个这样的映射。)

如果您想要正确检索WorkDay个对象,则必须相应地覆盖equals()hashCode()

查看这些方法的文档:

https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object- https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

答案 2 :(得分:0)

以下是我决定在Petter Friberg的帮助下做的事。

我创建了这个类:

public class DateKey {

    private static SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
    private String dateKey;

    public DateKey(Date date) {
        dateKey = dateFormat.format(date);
    }

    public String getDateKey() {
        return dateKey;
    }

}

此类现在作为我的hashmap中的键:

Map<DateKey, WorkDay> schedule = new HashMap<DateKey, WorkDay>();
schedule.put(new DateKey(workDay.getDate()), workDay);

我应该覆盖此类的equals和hashCode吗?