黑马程序员技术交流社区
标题:
关于比较器的问题
[打印本页]
作者:
唐晓
时间:
2013-1-20 14:50
标题:
关于比较器的问题
class Student implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
//return 0;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
//System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
/**/
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
复制代码
class MyCompare implements Comparator
{
public int compare(Object o1,Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
if(num==0)
{
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
/*
if(s1.getAge()>s2.getAge())
return 1;
if(s1.getAge()==s2.getAge())
return 0;
return -1;
*/
}
return num;
}
}
复制代码
这两种比较器有什么区别?
作者:
cyh8807
时间:
2013-1-20 15:10
本帖最后由 赵彦辉 于 2013-1-20 15:17 编辑
第一种方式为:让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo()方法,这种方式成为元素的自然顺序。
但是当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
定义比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主;
说的更直接点就是你写的第一个比较方式为默认的比较方式,程序运行时会首先调用它进行比较。
当你对默认的比较方法不满意时,可以自己定义比较器,让程序按照自己写的比较器方式进行比较。
作者:
vmvm555
时间:
2013-1-20 20:59
就像二楼所说的那样,在这补充一下,如果一个类已经开发完成,并且该类不是有你自己开发的,在其他程序中多次用到了这个类,如String,它是按自然法则进行排序的(不适合大幅度修改代码,你也改不了),又或者该类并没有实现Comparable接口,无法对其进行排序操作,这时候就应该自定义比较器,实现Comparator接口
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2