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

© 朱烈葵 中级黑马   /  2012-7-17 15:35  /  1514 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

day15天里面的GenericDemo里面,为什么比较器o1和o2换位置就,排出不同的顺序呢?手机发贴不方便……

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1

查看全部评分

11 个回复

倒序浏览
本帖最后由 黑马刘涛 于 2012-7-17 16:01 编辑

  1. class LenComparator implements Comparator<String>
  2. {
  3.         public int compare(String o1,String o2)
  4.         {
  5.                 int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));

  6.                 if(num==0)
  7.                         return o2.compareTo(o1);
  8.                 return num;
  9.         }
  10. }
复制代码
这是o1,和o2调换过来后的代码,new Integer(o2.length()).compareTo(new Integer(o1.length()));比较的是两个字符串的长度,如果o2的长度大于o1的长度返回数值大于0。如果代码这样写又不一样了
  1. class LenComparator implements Comparator<String>
  2. {
  3. public int compare(String o1,String o2)
  4. {
  5. int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));

  6. if(num==0)
  7. return o1.compareTo(o2);
  8. return num;
  9. }
  10. }

复制代码
这时int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));返回的数值小于0,当然等于0的时候还会比较字符串的大小,不作赘述。
API说明“int compare(T o1,            T o2)比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。”
参数: o1 - 要比较的第一个对象。 o2 - 要比较的第二个对象。 返回: 根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。”
回复 使用道具 举报
import java.util.*;
class GenericDemo2
{
        public static void main(String[] args)
        {
                TreeSet<String> ts = new TreeSet<String>(new LenComparator());

                ts.add("abcd");
                ts.add("cc");
                ts.add("cba");
                ts.add("aaa");
                ts.add("z");
                ts.add("hahaha");


                Iterator<String> it = ts.iterator();

                while(it.hasNext())
                {
                        String s = it.next();
                        System.out.println(s);
                }
        }
}


class LenComparator implements Comparator<String>
{
        public int compare(String o1,String o2)
        {
                int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));

                if(num==0)
                        return o2.compareTo(o1);
                return num;
        }
}

你是说上面这段代码吗?
回复 使用道具 举报
朱烈葵 来自手机 中级黑马 2012-7-17 15:58:09
板凳
康大玮 发表于 2012-7-17 15:48 import java.util.*; class GenericDemo2 {

是的 ,纠结的地方为什么o1和o2换下位置,排序结果就变了,不懂?
回复 使用道具 举报
Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.
因为比较这两个数是按照参数的先后顺序的。返回的数是要看第一个参数是小于,等于或大于第二个参数,对应的返回一个负整数,零或正整数。
不同位置返回的数是不同的,结果为相反数。
compare(x,y)=-compare(y,x)
回复 使用道具 举报
JDK 这样中描述
  :比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
     也就是根据当前对象与你所要比较的对象的结果来判断,调换下位置,则返回结果相反,所以会出现相反的顺序
回复 使用道具 举报
朱烈葵 发表于 2012-7-17 15:58
是的 ,纠结的地方为什么o1和o2换下位置,排序结果就变了,不懂?

o1 和o2都是局部变量
回复 使用道具 举报
首先你要知道 TreeSet有两种排序方式:
TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式。当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
回复 使用道具 举报
朱烈葵 来自手机 中级黑马 2012-7-17 16:20:31
9#
我能理解里面排出正顺序,不能理解换个位置就变反了,你们说的我都知道,
回复 使用道具 举报
朱烈葵 发表于 2012-7-17 16:20
我能理解里面排出正顺序,不能理解换个位置就变反了,你们说的我都知道, ...

你看啊 ,假如o1是"abcdef" o2是"abc"  ,调用compare 的时候 ,应为o1长度大于o2 所以num 是1  返回1
当反过来 o1是"abc" o2是"abcdef""  ,调用compare 的时候 ,应为o1长度小于o2所以 num 就办成-1 返回 -1
比较用来排序的两个参数。根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
康大玮 发表于 2012-7-17 15:48
import java.util.*;
class GenericDemo2
{

是的 ,纠结的地方为什么o1和o2换下位置,排序结果就变了,不懂?
回复 使用道具 举报
康大玮 发表于 2012-7-17 16:36
你看啊 ,假如o1是"abcdef" o2是"abc"  ,调用compare 的时候 ,应为o1长度大于o2 所以num 是1  返回1
当 ...

好像是这么回事,我也感觉是这么回事
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马