黑马程序员技术交流社区

标题: 有个问题不是很明白。 [打印本页]

作者: toselect    时间: 2014-5-3 23:59
标题: 有个问题不是很明白。
本帖最后由 toselect 于 2014-5-5 22:18 编辑

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(o1.length()).compareTo(new Integer(o2.length()));//这种方式是以从小到大方式排,毕老师讲只要调换下o1和o2的位置就可以实现倒序排

                if(num==0)
                        return o1.compareTo(o2);
                return num;
        }
}
我能理解可以通过改变num的正负实现倒序,这是改变了机器的判断,明明是大的强迫它判定成小的。
但是compareTo的功能不就是判定两个数的大小吗,用A和B去比较与用B和A去比较从结果上来说有会有什么区别呢?大的还是大的,小的就是小的啊?


作者: 谢振宣    时间: 2014-5-4 00:43
调用compareTo方法比较时,是有顺序的,是将调用者与传入者相比较。
当调用者的值比传入者的值小的时候,返回的是负数。
此时将两者的位置互换之后,就是调用者的值比传入者的值大了,这时返回的就是正数。
换位之后,返回的值刚好相反,就实现了反转排序的目的。
作者: cuilitang    时间: 2014-5-4 10:42
  1. class LenComparator implements Comparator<String> {
  2.        
  3.        
  4.         public int compare(String o2, String o1) {
  5.                 int num = new Integer(o1.length()).compareTo(new Integer(o2.length()));// 这种方式是以从小到大方式排,毕老师讲只要调换下o1和o2的位置就可以实现倒序排
  6.                 /**
  7.                  * 大哥,你 明明是 o1和o2进行比较,你就应该吧o2当做参数放进参数里面,这样返回的值才是正确的,
  8.                  * 你若是反过来让o1当做参数,返回的int值当然是反得,但是你的外层compare(o1,o2)方法参数列表没变,当然结果要反过来了。
  9.                  *
  10.                  * 验证:在o2.compareTo(o1)的同时将compare的参数调转一下成为compare(o2,o1),这样aaa和cba的顺序就不会乱了。
  11.                  * 但是这样,上面的num值就又反了,所以变成了长度倒序。
  12.                  *
  13.                  */
  14.                 if (num == 0){return o2.compareTo(o1);}
  15.                
  16.                 return num;
  17.         }
  18. }
复制代码

作者: cuilitang    时间: 2014-5-4 10:50
简而言之一句话:参数传反了




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