黑马程序员技术交流社区

标题: 解错题 [打印本页]

作者: gsa798780633    时间: 2016-5-27 18:06
标题: 解错题
一个小练习,下面的程序作用是将list中的元素进行排序,你能发现下面程序的错误吗?
import java.util.*;

public class SortDemo {
public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("cccd");
        list.add("ccc");
        list.add("aaa");
        list.add("aaa");
        list.add("bbb");
        list.add("ddad");
        list.add("ddd");
        sort(list);
        System.out.println(list);
}
public  static void sort(ArrayList<String> list) {
        TreeSet<String> treeSet=new TreeSet<String>(new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                        int num=o1.length()-o2.length();//长度比较为主要条件
                        return num==0?o1.compareTo(o2):num;//长度相等时,字符串比较为次要条件
                }
        });
        treeSet.addAll(list);
        list=new ArrayList<>(treeSet);
}
}

作者: lifeiwangyue    时间: 2016-5-27 23:12
最后一句代码   是不是数据结构的问题  //list.clear();                 //list.addAll(treeSet);  这样会不会错了
作者: 一个大西瓜    时间: 2016-5-27 23:48
分开编译一下
作者: 新晋猿工    时间: 2016-5-28 00:58
看了半个钟,看不出什么错的··········持续关注中
作者: z736886202    时间: 2016-5-28 01:10
sort(list);  不能直接这样写吧  Arrays.sort(list);这个数组工具类的类名点调用吧
作者: huburt    时间: 2016-5-28 09:05
你的问题是打印list发现没有排序把?
关键是这一句  list=new ArrayList<>(treeSet);
sort方法传递的是list的地址值,上面这句是用new在堆内存中有新建了一个对象,把这个地址值覆盖了传进来的list, 但是你主方法的list指向的还是原来的那个地址值,因此没有完成排序;可以这样修改:
  1. public static void main(String[] args) {
  2.                 ArrayList<String> list = new ArrayList<>();
  3.                 list.add("cccd");
  4.                 list.add("ccc");
  5.                 list.add("aaa");
  6.                 list.add("aaa");
  7.                 list.add("bbb");
  8.                 list.add("ddad");
  9.                 list.add("ddd");

  10.                 System.out.println(sort(list));// 修改处
  11.         }

  12.         public static ArrayList<String> sort(ArrayList<String> list) {
  13.                 TreeSet<String> treeSet = new TreeSet<String>(new Comparator<String>() {
  14.                         @Override
  15.                         public int compare(String o1, String o2) {
  16.                                 int num = o1.length() - o2.length();// 长度比较为主要条件
  17.                                 return num == 0 ? o1.compareTo(o2) : num;// 长度相等时,字符串比较为次要条件
  18.                         }
  19.                 });
  20.                 treeSet.addAll(list);

  21.                 return new ArrayList<>(treeSet);// 修改处
  22.         }
复制代码

作者: haojingwei310    时间: 2016-5-28 23:22
关注中....
作者: liukai3385    时间: 2016-5-28 23:46
本帖最后由 liukai3385 于 2016-5-28 23:56 编辑
  1. public static void main(String[] args) {
  2.                 ArrayList<String> list = new ArrayList<>();
  3.                 list.add("cccd");
  4.                 list.add("ccc");
  5.                 list.add("aaa");
  6.                 list.add("aaa");
  7.                 list.add("bbb");
  8.                 list.add("ddad");
  9.                 list.add("ddd");
  10.                 ArrayList<String> s = sort(list);
  11.                 System.out.println(s);
  12.         }

  13.         public static ArrayList<String> sort(ArrayList<String> list) {
  14.                 TreeSet<String> treeSet = new TreeSet<String>(new Comparator<String>() {
  15.                         @Override
  16.                         public int compare(String o1, String o2) {
  17.                                 int num = o1.length() - o2.length();// 长度比较为主要条件
  18.                                 return num == 0 ? o1.compareTo(o2) : num;// 长度相等时,字符串比较为次要条件
  19.                         }
  20.                 });
  21.                 treeSet.addAll(list);
  22.                 list = new ArrayList<>(treeSet);
  23.                 return list;
  24.         }
复制代码







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