重写来equals后添加重复数据到集合中还是有问题

重写来equals后添加重复数据到集合中还是有问题

这是重写的Student中的equals方法

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

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

Student stu = (Student) obj;

return stu.getName().equals(name) && stu.getStuId() == stuId;

}

return false;

}


当我添加了一个学好和姓名相同但是成绩不同的数据到set中,并没有被定义成重复的,而是添加进去了

Student s4 = new Student(3,"William",70);

set.add(s4);

it = set.iterator();

while(it.hasNext()){

System.out.println(it.next());

}


正在回答 回答被采纳积分+1

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

2回答
提问者 洋山芋的大哥哥 2017-05-28 14:07:00

public class Student {

private int stuId;

private String name;

private float score;


public Student(int stuId, String name, float score) {

super();

this.setName(name);

this.setScore(score);

this.setStuId(stuId);

}


public int getStuId() {

return stuId;

}


public void setStuId(int stuId) {

this.stuId = stuId;

}


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public float getScore() {

return score;

}


public void setScore(float score) {

this.score = score;

}


@Override

public String toString() {

return "[学号:" + stuId + ", 姓名:" + name + ", 成绩:" + score + "]";

}


@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((name == null) ? 0 : name.hashCode());

result = prime * result + Float.floatToIntBits(score);

result = prime * result + stuId;

return result;

}


@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

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

Student stu = (Student) obj;

return stu.getName().equals(name) && stu.getStuId() == stuId;

}

return false;

}


}

下面是测试类

import java.util.ArrayList;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;


public class Test{

public static void main(String[] args){

Student s1 = new Student(1,"Tom",87);

Student s2 = new Student(2,"Lucy",95);

Student s3 = new Student(3,"William",65);

HashSet set = new HashSet();

set.add(s1);

set.add(s2);

set.add(s3);

Iterator it = set.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

System.out.println("---------------------");

Student s4 = new Student(3,"William",65);

set.add(s4);

it = set.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

}

}

好像复制过来格式不对。

好帮手慕珊 2017-05-27 17:55:04

你好!最好贴一下完整的代码,通过描述看不出来到底哪块出问题了。

  • 提问者 洋山芋的大哥哥 #1
    public class Student { private int stuId; private String name; private float score; public Student(int stuId, String name, float score) { super(); this.setName(name); this.setScore(score); this.setStuId(stuId); } public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } @Override public String toString() { return "[学号:" + stuId + ", 姓名:" + name + ", 成绩:" + score + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + Float.floatToIntBits(score); result = prime * result + stuId; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj.getClass() == Student.class) { Student stu = (Student) obj; return stu.getName().equals(name) && stu.getStuId() == stuId; } return false; } }
    2017-05-28 14:06:04
  • irista23 回复 提问者 洋山芋的大哥哥 #2
    原因是重写hashCode()方法时,分数也是会生成不同的hashCode。程序向HashSet中添加一个对象时,先用hashCode方法计算出该对象的哈希码。如果该对象哈希码与集合已存在对象的哈希码不一致,则该对象没有与其他对象重复,添加到集合中。修改方法去掉result = prime * result + Float.floatToIntBits(score);代码。
    2017-05-28 22:16:00
  • Suwenxj1989 回复 irista23 #3
    嗯嗯,就看到你说了正解!
    2018-03-06 22:46:29
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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