黑马程序员技术交流社区

标题: 为什么我的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
  1. 实在查不出哪出问题了,equals应该要运行啊!!!
  2. import java.util.*;
  3. class StudentTest
  4. {
  5. public static void main(String[] args)
  6. {
  7.   List<Student> all = new ArrayList<Student>();
  8.   all.add(new Student("张三","No:01",98.1));
  9.   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