黑马程序员技术交流社区

标题: ArrayList的排序问题 [打印本页]

作者: 追逐    时间: 2014-3-23 22:36
标题: ArrayList的排序问题
本帖最后由 追逐 于 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循环输出的结果。求大神帮忙分析一下。



作者: 焚雨成灰    时间: 2014-3-23 23:21
本帖最后由 焚雨成灰 于 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. }
复制代码




作者: 追逐    时间: 2014-3-23 23:47
焚雨成灰 发表于 2014-3-23 23:21
你错的那段代码顺序是
1.先打印第一个放进al中的字符串,因为你把it.next()放进s中了!,所以第一个是abcd ...

哦哦。明白了。谢谢




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