老师帮忙看下这个问题!

老师帮忙看下这个问题!

public class Student {
	private String name;
	private int stuld;//学号
	private float score;//成绩
	//构造方法
	public Student(String name, int stuld, float score) {
		super();
		this.name = name;
		this.stuld = stuld;
		this.score = score;
	}
	//getter 和 setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getStuld() {
		return stuld;
	}
	public void setStuld(int stuld) {
		this.stuld = stuld;
	}
	public float getScore() {
		return score;
	}
	public void setScore(float score) {
		this.score = score;
	}
	
	@Override
	public String toString(){
		return "[学号:" + stuld + ", 姓名:" + name + ", 成绩:"
				+ score + "]";
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + stuld;
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		//判断对象是否相等,相等则返回true,不用继续比较属性了
		if(this==obj){
			return true;
		}
		//判断obj是否是Student类的对象
		if(obj.getClass()==Student.class){
			Student stu = (Student)obj;
			return stu.getName().equals(name) && stu.getStuld()==stuld;
		}
		return false;
	}
	
}


public class StudentTest {
	public static void main(String[] args) {
		//定义三个Student类的对象及一个HashSet类的对象
        Student stu1 = new Student("William", 3, 65.0f);
        Student stu2 = new Student("Tom", 1, 87.0f);
        Student stu3 = new Student("Lucy", 2, 95.0f);
        Set set = new HashSet();
        
		//将Student类的对象添加到集合中
		set.add(stu1);
		set.add(stu2);
		set.add(stu3);
        
		//使用迭代器显示Student类的对象中的内容
		Iterator it = set.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
		
		//添加重复元素
		Student stu4 = new Student("Tom", 2, 88.0f);
		set.add(stu4);
		it = set.iterator();
		System.out.println();
		System.out.println("添加重复元素后的内容:");
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
}

我的代码是这样的,但是得到的结果还是不对:

添加重复元素后的内容:

[学号:2, 姓名:Tom, 成绩:88.0]

[学号:1, 姓名:Tom, 成绩:87.0]

[学号:2, 姓名:Lucy, 成绩:95.0]

[学号:3, 姓名:William, 成绩:65.0]


是否应该只要学号相同都不能添加元素?

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

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

1回答
一叶知秋519 2018-01-02 11:46:19

equals方法的判断依据是学号和姓名相等,两个都相等,则判断为同一元素,所以说你的代码这么写是没有问题的。如果只要学号相同就不能添加进去的话,那么应该将hashCode和equals中关于姓名的代码去掉。祝学习愉快~

  • 那结果是有问题的啊,不能添加进去为什么会有4条。
    2018-03-06 22:22:32
  • 我知道了,这个case工具自动添加的hashCode方法中 有一个Float.floatToIntBits(score); 所以float不相同直接就判断为不等了, 需要把默认的这行代码去了。
    2018-03-06 22:46:09
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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