Java 我可以使用Value';s属性作为HashMap中的键<;关键、价值>;

Java 我可以使用Value';s属性作为HashMap中的键<;关键、价值>;,java,android,Java,Android,我有一个日历视图小部件,其中的单元格表示每天。每个单元格都有一个日期对象。 我还有一堆WorkDay对象,它们以小时为单位表示每个日期的工作班次和日程安排。WorkDay对象中有日期 我想将这些WorkDay对象传递给日历,当对日历进行膨胀时,每个单元格都应该通过其Date对象检查哪个WorkDay属于它 我不想对WorkDay对象进行分组,我想使用键 我的问题是如果我决定使用HashMap来存储工作日, 我可以使用WorkDay的内部日期对象作为每个HashMap条目的键吗 像这样 hashM

我有一个日历视图小部件,其中的单元格表示每天。每个单元格都有一个日期对象。 我还有一堆WorkDay对象,它们以小时为单位表示每个日期的工作班次和日程安排。WorkDay对象中有日期

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

我不想对WorkDay对象进行分组,我想使用键

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

像这样

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

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

您可以使用
日期
对象作为
哈希映射
中的键,无论它是否覆盖
equals()
哈希代码()
方法

从类文档中:

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

如果要正确检索
WorkDay
对象,必须相应地重写
equals()
hashCode()

请查看这些方法的文档:


您可以使用
日期
对象作为
哈希映射
中的键,无论它是否覆盖
equals()
hashCode()
方法

从类文档中:

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

如果要正确检索
WorkDay
对象,必须相应地重写
equals()
hashCode()

请查看这些方法的文档:


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

这样做,您的代码将变得
Date
格式不可知(
dd.MM.yy
yyy.MM.dd G'at'hh:MM:ss z
),而不仅仅是在地图中存储一个紧凑的对象键(
Long

然后,您还可以将该值转换回您想要的任何类型的对象,例如
日历
、java
日期
、joda时间等


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

从技术上讲,使用
日期作为
HashMap
的键是没有问题的,但从设计角度看,您可能希望使用长字符来表示
毫秒的时间

这样做,您的代码将变得
Date
格式不可知(
dd.MM.yy
yyy.MM.dd G'at'hh:MM:ss z
),而不仅仅是在地图中存储一个紧凑的对象键(
Long

然后,您还可以将该值转换回您想要的任何类型的对象,例如
日历
、java
日期
、joda时间等


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

以下是我在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);
Map schedule=newhashmap();
schedule.put(新的日期键(workDay.getDate()),workDay);

我应该为这个类重写equals和hashCode吗?

在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);
Map schedule=newhashmap();
schedule.put(新的日期键(workDay.getDate()),workDay);

我应该重写这个类的equals和hashCode吗?

当然,我看不出有什么问题,唯一的问题是equals。。。因此,如果几秒钟后您有另一个数据对象,您将找不到workDay。。。也许简单地将日期设置为您需要的度量值(因此键入字符串)。@PetterFriberg根据问题的上下文,我认为他更担心的是哪一天。有很多方法可以实现相对性(从、之前、之后等…),只要键是唯一的(关键是它需要等于…),也许一个好方法是在工作日创建一个getKey,例如返回新的SimpleDataFormat(“yyyyMMdd”)。format(getDate())当然,我看这没什么错你唯一的问题是平等。。。因此,如果几秒钟后您有另一个数据对象,您将找不到workDay。。。也许简单地将日期设置为您需要的度量值(因此键入字符串)。@PetterFriberg根据问题的上下文,我认为他更担心的是哪一天。有很多方法可以实现相关性(从、之前、之后等…),只要键是唯一的(关键是它需要等于…),也许一个好方法是在工作日创建一个getKey,例如返回新的SimpleDataFormat(“yyyyMMdd”).format(getDate())