【问题标题】:Using a HashMap with my object as a key使用带有我的对象的 HashMap 作为键
【发布时间】:2013-12-29 20:43:23
【问题描述】:

我想做一个简单的笔记提醒应用程序,当日期是键,值是文本时使用 hashMap。 我有一个面板类 (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))

未触发。

可能是什么问题?

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

【问题讨论】:

  • 您需要覆盖hashCodeequals。如果您的对象在概念上相等,equals 需要返回 true,hashCode 需要为给定的一组对象内容返回一致的值,这样所有equals 对象将具有相同的hashCode
  • 您应该在 MyDateClass 代码中覆盖 hasCode 和 equals。
  • 我在 MyDateClass 类中覆盖它?关于如何覆盖它们的任何提示?

标签: java hashmap hashtable


【解决方案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;
}

编写 JUnit 来测试自反、对称、传递和一致的结果。

【讨论】:

    【解决方案2】:

    我清楚地知道你的问题,我认为这个函数总是返回 false。因为date(parameter) 和reminderMap 中的对象有不同的引用。所以它们不能相等。

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

    如果你想使用HashMapcontainsKey函数,也许你应该使用String或Number而不是MyDateClass。我的意思是你应该将MyDateClass 的对象转换为String 值,然后再将其插入reminderMap

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多