黑马程序员技术交流社区

标题: 关于排序的问题 [打印本页]

作者: 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集合中的元素进行排序,底层数据结构是二叉树,当两种排序都存在时,以比较器排序为主;

  1. class  TreeSetTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 TreeSet ts = new TreeSet(new StrLenComparator());//创建一个TreeSet,并传入一个比较器

  6.                 ts.add("abcd");//添加元素
  7.                 ts.add("cc");
  8.                 ts.add("cba");
  9.                 ts.add("aaa");
  10.                 ts.add("z");
  11.                 ts.add("hahaha");

  12.                 Iterator it = ts.iterator();//遍历打印这个集合,查看排序结果
  13.                 while(it.hasNext())
  14.                 {
  15.                         System.out.println(it.next());
  16.                 }
  17.         }
  18. }
  19. class StrLenComparator implements Comparator
  20. {
  21.         public int compare(Object o1,Object o2)//覆盖compare方法
  22.         {
  23.                 String s1 = (String)o1;
  24.                 String s2 = (String)o2;
  25.                        
  26.                 int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//字符串按长度从短到长排序
  27.                 if(num==0)
  28.                         return s1.compareTo(s2);
  29.                 return num;
  30.         }
  31. }
复制代码
当元素自身不具备比较性,或者具备的比较性不是所需要的,这时需要让容器自身具备比较性;定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数;当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法:
  1. import java.util.*;
  2. class Student implements Comparable//该接口强制让学生具备比较性。
  3. {
  4.         private String name;
  5.         private int age;

  6.         Student(String name,int age)
  7.         {
  8.                 this.name = name;
  9.                 this.age = age;
  10.         }

  11.         public int compareTo(Object obj)
  12.         {
  13.                 if(!(obj instanceof Student))
  14.                         throw new RuntimeException("不是学生对象");
  15.                 Student s = (Student)obj;

  16.                 if(this.age>s.age)
  17.                         return 1;
  18.                 if(this.age==s.age)
  19.                         return this.name.compareTo(s.name);
  20.                 return -1;
  21.         }

  22.         public String getName()
  23.         {
  24.                 return name;

  25.         }
  26.         public int getAge()
  27.         {
  28.                 return age;
  29.         }
  30. }
  31. class TreeSetDemo2
  32. {
  33.         public static void main(String[] args)
  34.         {
  35.                 TreeSet ts = new TreeSet();

  36.                 ts.add(new Student("lisi02",22));
  37.                 ts.add(new Student("lisi02",21));
  38.                 ts.add(new Student("lisi007",20));
  39.                 ts.add(new Student("lisi09",19));
  40.                 ts.add(new Student("lisi06",18));
  41.                 ts.add(new Student("lisi06",18));
  42.                 ts.add(new Student("lisi007",29));
  43.           //ts.add(new Student("lisi007",20));
  44.           //ts.add(new Student("lisi01",40));

  45.                 Iterator it = ts.iterator();
  46.                 while(it.hasNext())
  47.                 {
  48.                         Student stu = (Student)it.next();
  49.                         System.out.println(stu.getName()+"..."+stu.getAge());
  50.                 }
  51.         }
  52. }

  53. class MyCompare implements Comparator
  54. {
  55.         public int compare(Object o1,Object o2)
  56.         {
  57.                 Student s1 = (Student)o1;
  58.                 Student s2 = (Student)o2;

  59.                 int num = s1.getName().compareTo(s2.getName());
  60.                 if(num==0)
  61.                         return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
  62.                 return num;
  63.         }
  64. }
复制代码



作者: 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