compare函数的机制是自定义下若o1>o2则返回1,而楼主的代码中若1<2会返回1,即在楼主的自定义下,其实1是大于2的(即compare(1,2)=1),同理,2也会大于3.那么Array.sort()从小到大排序时其实3是最小的,故输出321,表面上是逆序了,实际是符合楼主compare函数中的定义的,还是从小到大输出,只不过楼主自定义下3是比1小的。

解决方案 »

  1.   

     return (i<j?1:(i==j?0:-1));问题出在这句话,当i>j的时候返回1,那时候才升序排列
      

  2.   

    返回值大于0应该是降序,返回值小于0升序,comparable里面的compareTo(Object o)一样的
      

  3.   

    这位个人觉得应该是解释的最清楚的。这其中涉及到一个默认的前提:
    Arrays.sort(T[] a,  Comparator<? super T> c) 你这里默认的是这个方法是升序排列的??所以根据自己定义的来如果
    compare(1,2)=1, compare(2,3)=1。。
    定义的是2比1小,3比2小。。所以再根据升序排列的话就是3 2 1是这样理解的吧
      

  4.   

    这位个人觉得应该是解释的最清楚的。这其中涉及到一个默认的前提:
    Arrays.sort(T[] a,  Comparator<? super T> c) 你这里默认的是这个方法是升序排列的??所以根据自己定义的来如果
    compare(1,2)=1, compare(2,3)=1。。
    定义的是2比1小,3比2小。。所以再根据升序排列的话就是3 2 1是这样理解的吧
    没错,就是这么理解的。Arrays.sort(T[] a,  Comparator<? super T> c) 默认就是升序排列的(其中比较的大小的规则就是compare中规定好的)。
      

  5.   

    这位个人觉得应该是解释的最清楚的。这其中涉及到一个默认的前提:
    Arrays.sort(T[] a,  Comparator<? super T> c) 你这里默认的是这个方法是升序排列的??所以根据自己定义的来如果
    compare(1,2)=1, compare(2,3)=1。。
    定义的是2比1小,3比2小。。所以再根据升序排列的话就是3 2 1是这样理解的吧
    没错,就是这么理解的。Arrays.sort(T[] a,  Comparator<? super T> c) 默认就是升序排列的(其中比较的大小的规则就是compare中规定好的)。OK,,默认就是升序那就完全能理解了多谢!在这点上还是C++的那个仿函数自定义比较大小比较好理解#include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;class DescType
    {
    public:
    bool operator() (int a, int b)
    {
    return (a < b);
    }
    };int main()
    {
    vector<int> vint;

    vint.push_back(1);
    vint.push_back(2);
    vint.push_back(3);

    sort(vint.begin(), vint.end(), DescType() );

    for (vector<int>::iterator iter = vint.begin(); iter != vint.end(); iter++)
    cout << *iter << " ";

    return 0;
    }