java的api中这个方法
sort(List <T> list, Comparator <? super T> c)
api的解释是:根据指定比较器产生的顺序对指定列表进行排序。
Comparator里的compare方法在api里解释是:比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
问题:重写Comparator里的compare方法,compare根据传进去的两个对象进行对比后返回一个整数,compare只是返回了一个整数来表明<,=,>,但是并没有根据compare的返回结果对这两个对象进行某种排序,那么最后比较器是怎么产生顺序的?

解决方案 »

  1.   

    是实现Comparable接口,重写compareTo(T o) 方法。
    楼主看下api Comparable接口的内容。不要与Comparator弄混子。
      

  2.   

    比较规则是根据 Comparator的,但是如何排序就是sort的事情了,应该是sort调用了comparator的比较规则,具体是怎么调用的,可以自己去翻源码。
      

  3.   

    排序需要做的就两件事:比较某两个元素的大小
    交换某两个原素的位置这两件事跟据一定的规则做很多次,实现对一个集合内元素的排列,这就是所谓的排序算法。Comparator负责的只是第一件事: 比较某两个元素的大小。
      

  4.   

    呵呵,建议LZ静下心来看看书哦。google一些实例看看,或者找本java的书,还有学会看Java的API,那样收获会更大一些。
      

  5.   

    Comparator是比较器,它本身只负责比较两个数据,然后把结果返回,至于它的调用者获的返回结果后如何处理它不管,也就是说Comparator本身不负责排序,只负责比较,排序处理是它的调用者实现的,也就是在sort方法里实现的sort的伪代码可以这样(假设使用冒泡法)
    for (int i=0; i<list.size(); i++) {
        for (int j=0; j<list.size()-i-1; j++) {
            if (c.compare(list.get(j), list.get(j+1)) > 0) {//比较器只负责比较,本身不排序
                //如果相邻两个数据前者大于后者则交换两个数据,也就是排序由sort方法负责
                T temp = list.get(j);
                list.set(j, list.get(j+1)); 
                list.set(j+1, temp); //交换j和j+1位置的数据   
            }
        }
    }
      

  6.   

    [Quote=引用 6 楼  的回复:]非常感谢你认真的解答。
    我的意思就是Comparator是比较器它本身只负责比较两个数据,然后把结果返回,sort根据返回结果进行排序,那我怎么知道sort是怎么排序的?也就是说假如进行某个排序,Comparator只是返回比较结果,问题是根本不知道sort根据不同比较结果进行什么样的排序(比如Comparator返回的比较结果是1,sort怎么进行排序;返回-1,又是怎么排序),怎么确定?
      

  7.   


    比如一个list里面放很多对象
    而你写一个比较器,实现在Comparator接口,并重写了compare(T o1, T o2) 方法。
    当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现在逻辑,而返回负整数、零或正整数
      

  8.   

    上一个回复,没回完就点提交了。接着说。比如一个list里面放很多对象 
    而你写一个比较器,实现了Comparator接口,并重写了compare(T   o1,   T   o2)   方法。 
    当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现的逻辑,而返回负整数、零或正整数。而内存就是根据这个返回值,如果是两个对象比较后,返回一正整数,则说明前一个对象大于后一个对象,这里将对list中的这两对象进行对调。大致的源码就是这样:for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
     swap(dest, j, j-1);
    所以可以看出,当compare返回一正数是,前后两个对角交换位置,从而实现了排序。
      

  9.   

    刚打出错别字了,修正:比如一个list里面放很多对象  
    而你写一个比较器,实现了Comparator接口,并重写了compare(T o1, T o2) 方法。  
    当调用sort进行对list中对象进行排序时,list中两两对象进行比较,比较方法就是采用compare()方法中实现的逻辑,而返回负整数、零或正整数。而内就是根据这个返回值,如果是两个对象比较后,返回一正整数,则说明前一个对象大于后一个对象,这里将对list中的这两对象进行对调。大致的源码就是这样:for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
        swap(dest, j, j-1);所以可以看出,当compare返回一正数是,前后两个对交换位置,从而实现了排序。
      

  10.   


    sort方法怎么实现,可以查看源码
    但是一般思路都是从升序开始(可能人的意识是看到排序最初的印象是升序),但是因为sort本身是个模板,也就是希望sort不改变,由用户传入的比较器来决定排序,所以6L的伪代码就是基于升序的基础去处理的,sort里面只需要关心比较器的返回值,如果返回值大于0,则说明比较参数1大于比较参数2,则把参数1"沉底"(换过来说就是参数2冒泡),这样当用户改变比较器,原本参数1大于参数2应该返回大于0的,可用户却故意返回小于0,这样相当于比较器欺骗了sort,sort因为只关心结果,于是就认为参数2大于参数1,于是把参数2"沉底"(参数1冒泡),这样就相当于把“小”的放到最底,于是也就成了“降序”排序。
    所以,排序的模板一般来说都是基于升序实现的,如果要达到“降序”,就由用户去实现比较器然后传给sort方法就可以了