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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 周坤 于 2012-7-22 00:22 编辑
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;

  5. public class CollectionsDemo {
  6.         public static void main(String[]args)
  7.         {
  8.                 sortDemo();
  9.         }
  10.         public static void sortDemo()
  11.         {
  12.                 List<String> ss=new ArrayList<String>();
  13.                 ss.add("abc");
  14.                 ss.add("a");
  15.                 ss.add("tbceet");
  16.                 ss.add("zbcfd");
  17.                 sop(ss);
  18.                 Collections.sort(ss,new sortComparator());//这里编译不过去,问下为什么?
  19.                 sop(ss);
  20.         }
  21.         class sortComparator implements Comparator<String>
  22.         {
  23.                 public int compare(String s1,String s2)
  24.                 {
  25.                         if (s1.length()>s2.length())
  26.                                 return 1;
  27.                         if (s1.length()<s2.length())
  28.                                 return -1;
  29.         
  30.                                 return s1.compareTo(s2);
  31.                         
  32.                 }
  33.         }
  34.         public static void sop(Object obj)
  35.         {
  36.                 System.out.println(obj);
  37.         }

  38. }
复制代码

6 个回复

倒序浏览
楼主,你这个问题很有意思哦,我给你的解决方法是
第一种解决方案:正常的比较器做法是不会作为内部类来使用的,你可以把按照正常的方式来,就没问题了。
代码就不贴了,你只需要把你的那个比较器别作为内部类来使用就行了,这个不用我细说了吧
第二种解决方案:如果楼主你真心的想用内部类来实现,那么给你的这个这个内部类来个静态修饰吧,就是让内部类和外部类在加载的时候保持一致的步调,代码如下:import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class CollectionsDemo1 {
        public static void main(String[]args)
        {
                sortDemo();
        }
        public static void sortDemo()
        {
                List<String> ss=new ArrayList<String>();
                ss.add("abc");
                ss.add("a");
                ss.add("tbceet");
                ss.add("zbcfd");
                sop(ss);
                Collections.sort(ss,new sortComparator());
                sop(ss);
        }
        //在这里给你的内部类加个静态就哦了!!!
        static class sortComparator 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 static void sop(Object obj)
        {
                System.out.println(obj);
        }

}
第三种解决方法:嘿嘿,楼主,这个方法估计你会蒙圈的,用匿名内部类来实现。代码如下:
Collections.sort(ss,new 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);                     
                }
        });//将比较器作为匿名内部类来传递就不会出现错误了
求:加分!

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
陶锋 发表于 2012-7-21 22:07
类CollectionsDemo没有关闭的 } 这是一个问题;
还有问题,这里不能直接调用sop()方法,它和sortDemo()方法 ...

sop()方法是可以直接调用的,那里没问题。
问题出在Collections.sort(ss,new sortComparator());//这里编译不过去,问下为什么?
我的电脑是编译不过去,你的跑着有问题吗?
回复 使用道具 举报
谢谢了,受教了。
回复 使用道具 举报
1.这个程序中有几个角色,sortDemo和sop是静态方法,sortComparator是非静态内部类
2.sortDemo方法是类相关的,sortComparator非静态内部类是与field,方法,构造器和初始化块相似的类成员,它是实例相关的。在静态方法中,无法创建非静态内部类的实例。
3.因而有三种解法,一,将sortDemo和sortComparator都写为静态成员,二,将sortDemo和sortComparator都写为非静态成员,三,将sortDemo方法中的new sortComparator()改写为匿名内部类。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马