A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

实在查不出哪出问题了,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;
}
}

8 个回复

倒序浏览
你在程序中的确覆写了equals方法,但是你没有调用啊!!!
请问你在哪里调用了??

回复 使用道具 举报
  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()方法

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只是在用比较器进行ID的排序,不管重复不重复都放list集合内,要想去除同样的Student,就用set集合啊,直接用set集合设置比较器,就不用collections.sort了。
这些是我个人见解,有不对的地方请指正

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
sort排序是依据实现了Comparator的比较器,而比较器中也没有调用到equals方法。
也就是排序过程根本不依赖equals,怎么会调用呢。
回复 使用道具 举报
贾联国 发表于 2012-4-26 01:23
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只 ...

在他的比较器中,考虑到了同一个学生的排序问题,所以,他的本意不是需要一个排斥相同学生的集合。
回复 使用道具 举报
常万 中级黑马 2012-4-26 08:53:17
7#
贾联国 发表于 2012-4-26 01:23
好像这个程序本来就不调用equals啊,而且显示的结果也看不出来什么,list集合可以存重复的元素,这个程序只 ...

不是我想用List集合,是题目的要求...我怎么才能调用到equals呢?指点一下哈
回复 使用道具 举报
你做的equals方法是Student的equals方法,而比较器存在的意义就是无视本来的比较方法,把对象拿到比较器内进行比较,用的是比较器内的方法,要是真要写equals的话,我觉得应该在比较器内覆写equals,这只是我的猜测,可以试一下。不过比较器本身就相当于一个compareto,里面的方法可以完成很多的比较,还要覆写equals的我也没见过。
回复 使用道具 举报
沈样 黑马帝 2012-4-26 14:18:00
9#
本帖最后由 沈样 于 2012-4-26 14:20 编辑

不知道你为什么要运行equals,List特点是有序可以重复,如果你要调equals可以试试contains方法,这个底层是调用equals,排序的话可以自身实现comparable,或者集合加个comparator实现排序
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马