A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _王涛 中级黑马   /  2013-4-6 09:56  /  1195 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _王涛 于 2013-4-6 11:31 编辑

class MyStrCompare implements Comparator{
        public int compare(Object o1,Object o2){
                String s1=(String)o1;
                String s2=(String)o2;
                if(s1.length()>s2.length())
                        return 1;
                if(s1.length()==s2.length())
                        return 0;
                return -1;
        }
}
上面是一个对字符串长度进行排序的比较器,但是我们实现了compare方法后,里面传来两个参数o1和o2,我不太清楚这两个参数是从哪进传来的?还有这个compare这个方法返回的正数、负数、0,又是什么意思?利用比较器后它的底层是如何进行排序的?
希望各位大神给个详细的答案。。谢谢!!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
compare
int compare(T o1,
            T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
在前面的描述中,符号 sgn(expression) 表示 signum 数学函数,根据 expression 的值为负数、0 还是正数,该函数分别返回 -1、0 或 1。

实现程序必须确保对于所有的 x 和 y 而言,都存在 sgn(compare(x, y)) == -sgn(compare(y, x))。(这意味着当且仅当 compare(y, x) 抛出异常时 compare(x, y) 才必须抛出异常。)

实现程序还必须确保关系是可传递的:((compare(x, y)>0) && (compare(y, z)>0)) 意味着 compare(x, z)>0。

最后,实现程序必须确保 compare(x, y)==0 意味着对于所有的 z 而言,都存在 sgn(compare(x, z))==sgn(compare(y, z))。

虽然这种情况很普遍,但并不 严格要求 (compare(x, y)==0) == (x.equals(y))。一般说来,任何违背这个条件的 Comparator 都应该清楚地指出这一事实。推荐的语言是“注意:此 Comparator 强行进行与 equals 不一致的排序。”


参数:
o1 - 要比较的第一个对象。
o2 - 要比较的第二个对象。
返回:
根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

详情查看API:java.util
接口 Comparator<T>

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
徐升2013 发表于 2013-4-6 10:00
compare
int compare(T o1,
            T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第 ...

我想知道的是,这个方法底层是如何排序的,如果从小到大排序,是o1>o2的话,那么o1就排在最下面吗?这里怎么理解?
回复 使用道具 举报
本帖最后由 庞立森 于 2013-4-6 10:20 编辑

首先comparetor里面的参数是你要比较的两个对象,参数里面其实不一定写object o1,0bject o2,如果你知道你要比较的对象是是什么的话,你就可以直接写你要比较的对象的类型,比如Person o1 ,Person o2,如果你不知道你要比较的对象或者为了更好的扩展的话,你可写object o1,0bject o2,因为object为任何类型的父类。他可以接收任何类型。
这个返回值是为了排序做准备的,这个comparetor一般是用于其它的都写好了,用于补救的方法,比如说别人代码写好了不可以改,但是又不是你想要的,那么就可以用comparetor以第三方的形式去比较,如果是自己正在写代码,可以用实现comparable接口,覆写里面的compareTo()方法,然后用集合的sort方法直接去排序,

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
_王涛 发表于 2013-4-6 10:13
我想知道的是,这个方法底层是如何排序的,如果从小到大排序,是o1>o2的话,那么o1就排在最下面吗?这里 ...

这个不是排序的方法啊,比较的方式是由你来定义的,所以才需要赋写啊, 这个只是比较器,不负责排序,至于你想怎么排可以利用他来比较之后排序被
回复 使用道具 举报
        看代码:
        if(s1.length()>s2.length())
                        return 1;
如果返回1的话,那么s1大于s2,
                if(s1.length()==s2.length())
                        return 0;
如果返回0的话,那么s1等于s2,
                return -1;
如果返回1的话,那么s1小于s2,

排序是安照上面返回结果进行判断的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
class MyStrCompare implements Comparator{
        public int compare(Object o1,Object o2){
                String s1=(String)o1;
                String s2=(String)o2;
                if(s1.length()>s2.length())
                        return 1;
                if(s1.length()==s2.length())
                        return 0;
                return -1;
        }
}

代码中o1是你要添加的元素,o2是从容器中遍历的元素,也就是o1要与容器中的元素一一进行比较,按照容器中的算法进行添加。

例如:假如容器中的算法是从小到大排序
当返回1时 表示o1>o2则就放在 大于o2的地方
当返回-1 表示o1<o2就放在小于o2的地方
当返回0 表示o1==o2 如果不许相同就去掉o1。
具体大小数是怎样放的这就要看容器中数据结构了
有 二叉树的 有 链式的 有哈希式的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马