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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 凝聚 中级黑马   /  2013-10-10 21:25  /  2546 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 凝聚 于 2013-10-12 15:15 编辑


public class One {
        public static void main(String[] args) {
        sortDome();
        }
        public static void sortDome()
        {
                List<String>list=new ArrayList<String>();
                list.add("abcd");
                list.add("aaa");
                list.add("bbb");
                list.add("bbb");
                list.add("df");
                list.add("jkygs");
                list.add("abcdfjk");
                sop(list);
                //Collections.sort(list);//[abcd, aaa, bbb, bbb, df, jkygs, abcdfjk][aaa, abcd, abcdfjk, bbb, bbb, df, jkygs]
                Collections.sort(list,new cop());//[abcd, aaa, bbb, bbb, df, jkygs, abcdfjk]        [df, aaa, bbb, bbb, abcd, jkygs, abcdfjk]
                sop(list);
        }
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}
class cop implements Comparator<String>
{
public int compare(String s1,String s2)
{
if(s1.length()>s2.length())///////////////
        return 1;
if(s1.length()<s2.length())///////////////
        return -1;
return s1.compareTo(s2);//////////////////////
}
}
上述代码中
public int compare(String s1,String s2){if(s1.length()>s2.length())///////////////        return 1;if(s1.length()<s2.length())///////////////        return -1;return s1.compareTo(s2);//////////////////////}}这段代码我认为是谁的字符串长度长谁排在前头,但是输出的结果为        [df, aaa, bbb, bbb, abcd, jkygs, abcdfjk],为什么不是相反方向输出的。

评分

参与人数 1技术分 +1 收起 理由
To + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
其实你多试试几次就知道了,你的输出结果是从小到大排列,你只要把s1和s2互换就可以了,代码在下面
第一种方案:较长的放在前面,相同的按字母逆序排列(字母序号较大的放在前面)
  1. package dayof23;

  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.List;

  6. public class One {
  7.     public static void main(String[] args) {
  8.             sortDome();
  9.     }
  10.     public static void sortDome()
  11.     {
  12.             List<String>list=new ArrayList<String>();
  13.             list.add("abcd");
  14.             list.add("aaa");
  15.             list.add("bbb");
  16.             list.add("bbb");
  17.             list.add("df");
  18.             list.add("jkygs");
  19.             list.add("abcdfjk");
  20.             sop(list);
  21.             Collections.sort(list,new cop());
  22.             sop(list);
  23.     }
  24.     public static void sop(Object obj)
  25.     {
  26.             System.out.println(obj);
  27.     }
  28. }

  29. class cop implements Comparator<String>
  30. {
  31.         public int compare(String s1,String s2)
  32.         {
  33.                 if(s2.length()>s1.length())
  34.                     return 1;
  35.                 if(s2.length()<s1.length())
  36.                     return -1;
  37.                 return s2.compareTo(s1);
  38.         }
  39. }
复制代码
第二种方案:较长的放在前面,相同的按字母顺序排列(字母序号较小的放在前面),修改部分
  1. public int compare(String s1,String s2)
  2.         {
  3.                 if(s2.length()>s1.length())
  4.                     return 1;
  5.                 if(s2.length()<s1.length())
  6.                     return -1;
  7.                 return s1.compareTo(s2);
  8.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
To + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
自然排序是小的排在前面,所以你按照常规的retuan就会导致常规的自然排序。所以这里你要把你的1改成-1,-1改成1.
回复 使用道具 举报
To 金牌黑马 2013-10-11 11:04:08
板凳


楼主你好。如果问题已解决请及时将帖子状态改为提问结束,如果未解决请继续提问。谢谢合作
回复 使用道具 举报
if(s1.length()>s2.length())///////////////
         return 1;
if(s1.length()<s2.length())///////////////
         return -1;
如果if(s1.length()<s2.length())
           return 1;
if(s1.length()>s2.length())
           return 1;
自然就是长度大的在前面。长度小的在后面啊。只是符号的问题,下次注意就行了。
  

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
xh396660787 发表于 2013-10-11 18:08
你可以把这个和数字的排序联系起来记忆:
数字小的排在前面,所以前面的数字-后面的数字 < 0   返回-1
同理 ...

(s1.length()>s2.length())return 1;
这句话的意思不就是哪个字符串长哪个字符串先输出吗     如字符串长度为5的减去字符串长度为4的字符串 , 符合这句语句那么先得输出字符串为5 的字符串        啊,为什么输出的先是 字符串为4的字符串后输出的是字符串为5的字符串。       
回复 使用道具 举报
凝聚 发表于 2013-10-11 20:18
(s1.length()>s2.length())return 1;
这句话的意思不就是哪个字符串长哪个字符串先输出吗     如字符串长 ...

comparator方法是定义的比较大小,但是输出的时候,按照比较的规则从小到大输出的
回复 使用道具 举报 1 0
dolphin 中级黑马 2013-10-12 02:58:53
8#
本帖最后由 dolphin 于 2013-10-12 03:02 编辑

导致结果的在于这两点上,
第一个,是在对Collections.sort()理解上,
第二个,这段代码上
if(s1.length()<s2.length())
        return -1;

1 Collections.sort()这个指的是按照指定的顺序来排序,即new Cop写好的顺序,但Java一般默认为升序。
2 这个if()括号里只做判断条件,返回值由你设定,当if结果为true时,照你这个程序,为true,为1,则false,为-1。符合升序标准(可参照数组的sort方法),则会认为是升序排序。如果你反过来设置,为true时,返回-1,为false,返回1,则是降序排序了。
刚才前面的xh396660787说的"对于字符串长度字符串长的排在前面,就应该认为字符串长的-字符串短的 < 0 ,即返回-1",这句话本身就有问题,字符串长(假设为7)-字符串短(假设为5),结果肯定会>0的,他却说<0,况且前面对象要输出,提前是必须符合5>0的规则才行。
个人觉得
重要的是 第二步的理解上,
第二步怎么设置很重要。
另外Comparator默认是升序,但这个顺序还是可以自己设置改变的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马