HashSet问题

HashSet问题

老师,我定义了一个Song类,有成员属性

private String id; //歌曲id

private String name;//歌曲名

private String singer;//演唱者

当使用Set集合存储Song时,我重写了equals方法,如下:

public boolean equals(Object obj) {

if(this==obj)

return true;

if(Song.class == obj.getClass()){

Song song = (Song)obj;

return (this.getId().equals(song.getId()));

}

return false;

}

equals方法中我只将歌曲id进行了比较,那么请问当添加id相同的歌曲到集合时为什么还能添加呢?(我只想以id作为判断歌曲是否重复的依据)

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

任务要求是List类型,另外将歌曲添加到播放列表addToPlayList(Song song),首选要循环判断播放列表中的歌曲是否存在。如果你想解决HashSet添加重复问题,建议你把相关代码贴完整些便于帮你分析解决。

http://img1.sycdn.imooc.com//climg/5b83bda40001cbda11040409.jpg

  • 慕圣2241928 提问者 #1
    好,老师你看: @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((singer == null) ? 0 : singer.hashCode()); return result; } @Override public boolean equals(Object obj) { if(this==obj) return true; if(Song.class == obj.getClass()){ Song song = (Song)obj; return (this.getId().equals(song.getId())); } return false; } //重写toString方法 @Override public String toString() { return "歌曲信息 [歌曲编号:" + id + ", 歌曲名字:" + name + ", 演唱:" + singer + "]"; } 以上是Song类中重写的方法 Set <Song> songSet = new HashSet<Song>(); Song song1 = new Song ("1001","ew","wfw"); Song song2 = new Song ("1002","ew","wfw"); Song song3 = new Song ("1001","ier","odsa"); Song song4 = new Song ("1001","ew","wfw"); songSet.add(song1); songSet.add(song2); songSet.add(song3); songSet.add(song4); for (Song song : songSet) { System.out.println(song); } 这是测试类测试代码 测试结果: 歌曲信息 [歌曲编号:1001, 歌曲名字:ier, 演唱:odsa] 歌曲信息 [歌曲编号:1001, 歌曲名字:ew, 演唱:wfw] 歌曲信息 [歌曲编号:1002, 歌曲名字:ew, 演唱:wfw] 那么请问为什么输出了两个1001?,请问怎么让程序以Song的id作为主要参考依据输出一个1001?
    2018-08-27 17:34:29
  • irista23 回复 提问者 慕圣2241928 #2
    重写的hashCode()要与equals()一致,不然hashcode值总是不一致的,你需要把hashCode()里name和singer部分去掉,只保留id
    2018-08-27 18:17:02
  • irista23 回复 提问者 慕圣2241928 #3
    另外,粘贴代码切记在回复里,因为回复没有格式化代码功能,会看吐血的~~
    2018-08-27 18:18:01
irista23 2018-08-27 12:50:01

你是否重写了hashCode()方法,Java中重写equals()方法的同时需要重写hashCode()方法。

  • 提问者 慕圣2241928 #1
    重写了,但是没有用,还是不能以id来作为重复比较
    2018-08-27 14:24:00
  • irista23 回复 提问者 慕圣2241928 #2
    看你集合定义的类型,list有序可重复,set无序不可重复。
    2018-08-27 14:45:14
  • 提问者 慕圣2241928 #3
    集合定义类型为HashSet类型,我只想以id作为对象属性的比较对象是否相同
    2018-08-27 16:38:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师