我正在编写一个带有swing组件的Java应用程序。我有2个JLists从DefaultListModel获取数据,这些是2:
private DefaultListModel<Module> moduleListModel;
private DefaultListModel<Module> sem1ListModel;
模块是我创建的数据类。
现在的问题是,我想从moduleListModel中删除模块,如果它们也在sem1ListModel中。我知道sem1ListModel中有3个模块也在defaultListModel中,我用来检查它是否包含它们的代码是:
for(int i = 0; i < sem1ListModel.getSize(); i++){
Module mod = sem1ListModel.getElementAt(i);
System.out.println(mod);
if(moduleListModel.contains(mod)){
System.out.println(mod);
moduleListModel.removeElement(mod);
}
}
此代码应该正常工作,因为模块完全相同,但它没有! 当我将DefaultListModel打印到输出窗口时,我得到了这个:
System.out.println(sem1ListModel);
System.out.println(moduleListModel);
sem1ListModel: [软件开发1 [7学分],ICT管理1 [7学分],DOA I [6学分]] moduleListModel: [DOA I [6学分],软件开发1 [7学分],ICT管理1 [7学分],网页设计2 [5学分],软件1 [5学分]]
如您所见,软件开发1 [7学分],ICT管理1 [7学分],DOA I [6学分] 是两个DefaultListModel中的3个模块,应该删除来自moduleListModel,但这不会发生。
我做错了什么?
答案 0 :(得分:0)
我只是从评论中回答,所以这并不止于此。
问题是Module
对象实际上是不同的实例,并且没有覆盖equals
。这意味着,即使他们通过被覆盖的toString
打印相同的东西,该模型也将它们视为不同的对象,并且不执行删除。
解决此问题的标准方法是覆盖equals
(以及hashCode
,以防您想要使用散列数据结构。)