黑马程序员技术交流社区
标题:
为什么我的equals没有运行?实在找不出哪问题。。。
[打印本页]
作者:
常万
时间:
2012-4-25 23:36
标题:
为什么我的equals没有运行?实在找不出哪问题。。。
实在查不出哪出问题了,equals应该要运行啊!!!
import java.util.*;
class StudentTest
{
public static void main(String[] args)
{
List<Student> all = new ArrayList<Student>();
all.add(new Student("张三","No:01",98.1));
all.add(new Student("李四","No:02",92.3));
all.add(new Student("刘七","No:05",76.4));
all.add(new Student("王五","No:04",78.5));
all.add(new Student("刘七","No:05",77.4));
all.add(new Student("周六","No:03",66.3));
all.add(new Student("刘七","No:05",77.4));
MyCompare comparator = new MyCompare();
Collections.sort(all,comparator);
for (Student s:all )
{
System.out.println(s.toString());
}
}
}
//定义一个学生类
class Student
{
private String name;
private String id;
private double grade;
Student(String name,String id,double grade)
{
this.name = name;
this.id = id;
this.grade = grade;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getId()
{
return id;
}
public void setId(String id)
{
this.id = id;
}
public double getGrade()
{
return grade;
}
public void setGrade(double grade)
{
this.grade = grade;
}
//覆写Object类中的toString()方法
public String toString()
{
return "学生姓名:"+this.name+"\t学生编号:"+this.id+"\t学生成绩:"+this.grade;
}
//覆写equals方法
public boolean equals(Object obj)
{
if(!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student s=(Student)obj;
return this.name.equals(s.name)&&this.id.equals(s.id);
}
}
//比较器
class MyCompare implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num = s1.getId().compareTo(s2.getId());
if(num==0)
{
return new Double(s1.getGrade()).compareTo(new Double(s2.getGrade()));
}
return num;
}
}
作者:
徐鑫
时间:
2012-4-26 00:00
你在程序中的确覆写了equals方法,但是你没有调用啊!!!
请问你在哪里调用了??
作者:
孙国军
时间:
2012-4-26 01:00
实在查不出哪出问题了,equals应该要运行啊!!!
import java.util.*;
class StudentTest
{
public static void main(String[] args)
{
List<Student> all = new ArrayList<Student>();
all.add(new Student("张三","No:01",98.1));
all.add(new Student("李四","No:02",92.3));
复制代码
首先,恭喜你,你的程序没有任何问题
但是有一点要搞清楚,ArrayList集合中是可以包含重复元素的,它根本就不会调用equals()方法
作者:
贾联国
时间:
2012-4-26 01:23
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只是在用比较器进行ID的排序,不管重复不重复都放list集合内,要想去除同样的Student,就用set集合啊,直接用set集合设置比较器,就不用collections.sort了。
这些是我个人见解,有不对的地方请指正
作者:
高彰谦
时间:
2012-4-26 08:19
sort排序是依据实现了Comparator的比较器,而比较器中也没有调用到equals方法。
也就是排序过程根本不依赖equals,怎么会调用呢。
作者:
高彰谦
时间:
2012-4-26 08:20
贾联国 发表于 2012-4-26 01:23
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只 ...
在他的比较器中,考虑到了同一个学生的排序问题,所以,他的本意不是需要一个排斥相同学生的集合。
作者:
常万
时间:
2012-4-26 08:53
贾联国 发表于 2012-4-26 01:23
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只 ...
不是我想用List集合,是题目的要求...我怎么才能调用到equals呢?指点一下哈
作者:
贾联国
时间:
2012-4-26 12:56
你做的equals方法是Student的equals方法,而比较器存在的意义就是无视本来的比较方法,把对象拿到比较器内进行比较,用的是比较器内的方法,要是真要写equals的话,我觉得应该在比较器内覆写equals,这只是我的猜测,可以试一下。不过比较器本身就相当于一个compareto,里面的方法可以完成很多的比较,还要覆写equals的我也没见过。
作者:
沈样
时间:
2012-4-26 14:18
本帖最后由 沈样 于 2012-4-26 14:20 编辑
不知道你为什么要运行equals,List特点是有序可以重复,如果你要调equals可以试试contains方法,这个底层是调用equals,排序的话可以自身实现comparable,或者集合加个comparator实现排序
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2