使用HashMap将我的对象作为键

时间:2013-12-29 20:43:23

标签: java hashmap hashtable

我想制作一个简单的提示提醒应用,当日期是关键字,值是文本时使用hashMap。 我有一个Panel类(GUI),哈希表类(Reminder.java)和一个代表我目的的日期的“MyDateClass.java”。

我的gui由3个JComboBox(日,月,年),一个文本区和2个按钮组成 - “保存”,“加载”。

GUI面板中的2个按钮:

    butSave.addActionListener(new ActionListener () {

        public void actionPerformed(ActionEvent e) {
            MyDateClass chosenDate = new MyDateClass(cbYear.getSelectedIndex()+2013,cbMonth.getSelectedIndex()+1, cb.getSelectedIndex()+1);
            if(!remind.isReminderExists(chosenDate)){
                remind.save(chosenDate, tfReminder.getText());
                System.out.println("reminder doesnt exists");
            }}
    });
    butLoad.addActionListener(new ActionListener () {
        public void actionPerformed(ActionEvent e) {
            System.out.println("tryin to load");
            MyDateClass chosenDate = new MyDateClass(cbYear.getSelectedIndex()+2013,cbMonth.getSelectedIndex()+1, cb.getSelectedIndex()+1);

            if(remind.isReminderExists(chosenDate)){
                remind.Load(chosenDate);
                System.out.println("reminder exists");
            }}      
    });

提醒课程:

public class Reminder {

    Map<MyDateClass,String> reminderMap;

    public Reminder(){
        reminderMap = new HashMap<MyDateClass,String>();
    }
    public boolean isReminderExists(MyDateClass date){
        return reminderMap.containsKey(date);
    }
    public void save(MyDateClass date, String Input){
        System.out.println("Trying to save");
        reminderMap.put(date, Input);
    }
    public void Load(MyDateClass date){
        System.out.println("Trying to load");
        String output;
        output = reminderMap.get(date);
        System.out.println(output);
    }

所以在我按下保存按钮后,我从控制台获取:

Trying to save
reminder doesnt exists

但是我按下加载按钮的日期和

if(remind.isReminderExists(chosenDate))

Isnt触发。

可能是什么问题?

我是否需要覆盖hashCode()和equals()?我生成了它们,但我不知道是否以及如何更改equals()(我是否需要操纵它来比较两个日期?如果“this”指的是提醒对象,我该怎么做?)

2 个答案:

答案 0 :(得分:1)

尝试这样的事情。

@Override public boolean equals(Object o) {
    if(o == this) return true;
    if(!(o instanceof MyDateClass)) return false;
    MyDateClass that = (MyDateClass) o;

    // use == for primitives
    // use .compare for primitive wrappers where available
    // use .equals for objects 
    return this.ivar1 == that.ivar2 &&
           this.ivar2 == that.ivar2; //etc...    
}

// equal objects must have equal hash codes
@Override public int hashCode() {
    int result = 17;
    result = 31 * result + ivar1;
    result = 31 * result + ivar2;
    return result;
}

编写JUnits以测试反射性,对称性,传递性和一致性结果。

答案 1 :(得分:1)

由于我清楚地知道你的问题,我认为这个函数总是返回false。因为date(参数)和reminderMap中的对象具有差异参考。所以他们不能平等。

public boolean isReminderExists(MyDateClass date){
    return reminderMap.containsKey(date);
}

如果您想使用containsKey的{​​{1}}功能,可能应该使用HashMap或数字而不是String。我的意思是您应该将MyDateClass的对象转换为MyDateClass值,然后再将其插入String

reminderMap

否则,您可以将代码实现为Hot Licks提及。