黑马程序员技术交流社区
标题:
关于排序的问题
[打印本页]
作者:
12560zhang
时间:
2014-3-6 18:24
标题:
关于排序的问题
什么情况下使用Comparator,什么情况下使用Comparable,总是把它们搞混,请大神们用简单易记的语言描述下
作者:
一年_Hei
时间:
2014-3-6 18:31
让集合自己进行排序用comparator,让类自身有比较性用comparable
作者:
chen_x
时间:
2014-3-6 18:45
Comparable接口用在集合元素是,Comparator用在TreeSet集合本身,当元素不具备比较性,或者元素的比较性不是我们想要的,就要用Comparator, 让集合自身具备比较性。
集合的比较性会覆盖元素的比较性。
作者:
syw02014
时间:
2014-3-6 18:49
TreeSet集合排序有两种方式,Comparable和Comparator区别:
a、让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法;
b、让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数;第二种方式较为灵活。,对Set集合中的元素进行排序,底层数据结构是二叉树,当两种排序都存在时,以比较器排序为主;
class TreeSetTest
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new StrLenComparator());//创建一个TreeSet,并传入一个比较器
ts.add("abcd");//添加元素
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");
Iterator it = ts.iterator();//遍历打印这个集合,查看排序结果
while(it.hasNext())
{
System.out.println(it.next());
}
}
}
class StrLenComparator implements Comparator
{
public int compare(Object o1,Object o2)//覆盖compare方法
{
String s1 = (String)o1;
String s2 = (String)o2;
int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//字符串按长度从短到长排序
if(num==0)
return s1.compareTo(s2);
return num;
}
}
复制代码
当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器自身具备比较性;定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数;当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法:
import java.util.*;
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)
{
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
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 TreeSetDemo2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi02",21));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi06",18));
ts.add(new Student("lisi06",18));
ts.add(new Student("lisi007",29));
//ts.add(new Student("lisi007",20));
//ts.add(new Student("lisi01",40));
Iterator it = ts.iterator();
while(it.hasNext())
{
Student stu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
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()));
return num;
}
}
复制代码
作者:
12560zhang
时间:
2014-3-6 19:04
syw02014 发表于 2014-3-6 18:49
TreeSet集合排序有两种方式,Comparable和Comparator区别:a、让元素自身具备比较性,需要元素对象实现Comp ...
嗯,这个得记清,谢谢哈
作者:
victorsun
时间:
2014-3-6 19:08
这个问题可以这么理解,对你所定义的方法中的元素自身可以比较,那么就必须实现comparable接口,且覆盖compareTo方法,对你所定义方法中的集合自身可以比较,那么就必须实现comparator接口比较器,并且覆盖compare方法,并将该类的方法作为实参返回给集合的构造函数。
作者:
victorsun
时间:
2014-3-6 19:15
这个问题可以这么理解,对你所定义的方法中的元素自身可以比较,那么就必须实现comparable接口,且覆盖compareTo方法,对你所定义方法中的集合自身可以比较,那么就必须实现comparator接口比较器,并且覆盖compare方法,并将该类的方法作为实参返回给集合的构造函数。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2