黑马程序员技术交流社区

标题: 比较器都弄混了,什么是Comparator,Comparable,ComparaTo()? [打印本页]

作者: 七丶哥    时间: 2014-9-2 23:28
标题: 比较器都弄混了,什么是Comparator,Comparable,ComparaTo()?
比较器都弄混了,什么是Comparator,Comparable,ComparaTo()?用的时候有的混啊
作者: 谢建平    时间: 2014-9-3 03:16
compareTo()和compare() 是一个方法       comparable 和comparator 是接口   

comparable :对实现它的每个类的对象进行整体排序,这种排序称为类的自然排序,该类里面的重写的  
                     compareTo比较的方法,让该类的每个对象自身具有比较性
comparator  : 接口,要重写comapre(T t1,T t2)方法。
                     可以把实现这接口的类的对象 看成一个比较器。可用于传递给sort()方法,
                     如  Collections.sort(List<T> list,Comparator<? super T> c);
                           Arrays.sort(T[] a,Comparator<? super T> c);
                    还用于控制某些数据结果
                           在tree结构的容器时,如果存储的对象自身没有可比较性,在创建容器时,可
                   可以让容器自身具有比较功能,
                             如 TreeMap<T> tm = new TreeMap(Comparator<? super T> c);



                           
                          

作者: 格子、    时间: 2014-9-3 08:19
两个都是接口,一个在对象内部实现,一个单独实现可以作为参数传递,且优先级比对象内部的高!
作者: Java黑马    时间: 2014-9-3 11:26
谢谢分享
作者: zhxu188    时间: 2014-9-3 11:29
一开始都容易搞混淆,写得多了慢慢 就清楚了,个人体会
作者: 张周飞    时间: 2014-9-3 15:57
本帖最后由 张周飞 于 2014-9-3 16:10 编辑

/**
* 对象比较器
* 作用:对两个后者多个数据项进行比较,以确定他们是否相等或者是确定他们的大小关系及其排序。
* Arrays.sort();方法可实现对象的排序操作
* 自定义对象数组排序(自己设定值/属性 排序)
* 用到的     实现   Comparable接口。
* Comparable接口强制对实现它的每一个类的对象进行整体排序,这种排序叫:自然排序
*
* 类的:int CompareTo(T O)方法被称为:自然比较方法。
*      原型:public interface Comparable<T>{  //T类型/此类的对象名
*                        int CompareTo(T O);
*    >>>>>>>>比较此对象于指定对象的排序  int CompareTo(T O) // T此/当前对象   O参数对象<<<<<<<<<<<<
*                     如果:当前对象   >  参数对象         返回正整数  一般为 1      
*                           当前对象  <  参数对象         返回负整数   一般为 -1  
*                           当前对象  =  参数对象         返回 0   
*            }
* @author Administrator
*
*/代码一:package com.vice.personsortDemo;
import java.util.Arrays;
public class personsortDemo {
        public static void main(String[] args) {
                  String[] names={"苍井空","松岛枫","武藤兰","吉泽明步","波多野结衣","小泽玛利亚","泷泽萝拉","美惠子"};
                  Arrays.sort(names);
                  System.out.println(Arrays.toString(names));
                  //------------------/以下是/--------------------
                  Person[] persons={  new Person("苍井空",27),new Person("松岛枫",13),
                                              new Person("吉泽明步",33),new Person("波多野结衣",44),
                                              new Person("小泽玛利亚",9),new Person("泷泽萝拉",24),
                                              new Person("美惠子",14),new Person("武藤兰",30)                                       
                  };
                  Arrays.sort(persons);
                  System.out.println(Arrays.toString(persons));
        }
}

代码二:核心方法
package com.vice.personsortDemo;
public class Person implements Comparable< Person >{    //< Person >当前 /此类的对象名
              private String name;
              private int age;
              public Person(){}
              public Person(String name,int age){
                      this.name=name;
                      this.age=age;         
              }
            public String getName() {
                   return name;
            }
           public void setName(String name) {
                   this.name = name;
           }
          public int getAge() {
                 return age;
         }
         public void setAge(int age) {
                this.age = age;
          }
        @Override
        public String toString() {  //toString方法
                 return " Person [name=" + name + ",age=" + age + "]";
         }
        @Override
        public int compareTo(Person o) {
                                //实现:对象之间的比较规则--自己定义规则
                                //比如 这里我就  就按照年龄来比较了【也可按照name比较 那样字符串的话 是按照ASCII码 比较的
                                if(o==null){ //比较的对象如果为空的话  我就抛出一个异常【自己可自定义】
                                          throw new NullPointerException();
                                }
                                if(this.age<o.age){    // 当前对象   >  参数对象         返回正整数  一般为 1     
                                        return -1;
                                }
                                if(this.age>o.age){   // 当前对象  <  参数对象         返回负整数   一般为 -1  
                                        return 1;
                                }
                                return 0; //当前对象  =  参数对象         返回 0  
       }
}

-----------------------{:3_67:}骚年@  明白了吗?...................................................







作者: 粺¹³¼畅    时间: 2014-9-3 16:27
谢建平 发表于 2014-9-3 03:16
compareTo()和compare() 是一个方法       comparable 和comparator 是接口   

comparable :对实现它的 ...

不错啊!!
作者: 忆梦追风    时间: 2014-9-3 20:18
我表示我也混了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2