【发布时间】: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”指的是提醒对象,我该怎么做)
【问题讨论】:
-
您需要覆盖
hashCode和equals。如果您的对象在概念上相等,equals需要返回 true,hashCode需要为给定的一组对象内容返回一致的值,这样所有equals对象将具有相同的hashCode。 -
您应该在
MyDateClass代码中覆盖 hasCode 和 equals。 -
我在 MyDateClass 类中覆盖它?关于如何覆盖它们的任何提示?