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

© 追逐 高级黑马   /  2014-3-23 22:36  /  1261 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 追逐 于 2014-3-25 14:40 编辑
  1. import java.util.Collections;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.Comparator;

  6. class CollectionsDemo
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 listSort();
  11.         }

  12.         public static void listSort()
  13.         {
  14.                 List<String> al = new ArrayList<String>();
  15.                 al.add("abcd");
  16.                 al.add("a");
  17.                 al.add("abc");
  18.                 al.add("efang");
  19.                 al.add("ge");
  20.                 Iterator<String> it = al.iterator();
  21.                 for( ; it.hasNext(); )
  22.                 {
  23.                         String s = it.next();  //为什么这样做就不能正常程排序了呢?求解
  24.                         Collections.sort(al, new Comp());
  25.                         System.out.println(s);
  26.                 }

  27.                 /*//为什么这么做就可以呢?
  28.                 for( ; it.hasNext(); )
  29.                 {
  30.                         Collections.sort(al, new Comp());
  31.                         System.out.println(it.next());
  32.                 }*/
  33.         }
  34. }

  35. class Comp implements Comparator<String>
  36. {
  37.         public int compare(String s1, String s2)
  38.         {
  39.                 if(s1.length() > s2.length())
  40.                         return 1;
  41.                 if(s1.length() < s2.length())
  42.                         return -1;
  43.                 return s1.compareTo(s2);
  44.         }
  45. }
复制代码
为什么第二个for循环中能打印正确结果。而第一个for循环打印的结果却是错误的。而且结果令我很费解
下面有第一个for循环输出的结果。求大神帮忙分析一下。


评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

2 个回复

倒序浏览
本帖最后由 焚雨成灰 于 2014-3-23 23:24 编辑

你错的那段代码顺序是
1.先打印第一个放进al中的字符串,因为你把it.next()放进s中了!,所以第一个是abcd,然后it指向角标为1的元素
2.al根据长度排序一次,"a"在0的位置"ge"在1的位置,所以s中存放的是ge
3.后面以此类推,随着it一个一个指下去,由于"a"在第一次循环中就被放在0角标的位置了,所以后面打不出来了
第二个就没这个问题因为先排序了,其实完全可以把排序拿出来
  1. import java.util.Collections;
  2. import java.util.List;
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.Comparator;

  6. class Test
  7. {
  8.         public static void main(String[] args)
  9.         {
  10.                 listSort();
  11.         }

  12.         public static void listSort()
  13.         {
  14.                 List<String> al = new ArrayList<String>();
  15.                 al.add("abcd");
  16.                 al.add("a");
  17.                 al.add("abc");
  18.                 al.add("efang");
  19.                 al.add("ge");
  20.                 Iterator<String> it = al.iterator();
  21.         
  22.                 Collections.sort(al, new Comp());
  23.                 for( ; it.hasNext(); )
  24.                 {
  25.                         System.out.println(it.next());
  26.                 }
  27.         }
  28. }

  29. class Comp implements Comparator<String>
  30. {
  31.         public int compare(String s1, String s2)
  32.         {
  33.                 if(s1.length() > s2.length())
  34.                         return 1;
  35.                 if(s1.length() < s2.length())
  36.                         return -1;
  37.                 return s1.compareTo(s2);
  38.         }
  39. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
焚雨成灰 发表于 2014-3-23 23:21
你错的那段代码顺序是
1.先打印第一个放进al中的字符串,因为你把it.next()放进s中了!,所以第一个是abcd ...

哦哦。明白了。谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马