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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 严海荣 高级黑马   /  2012-9-20 23:39  /  2103 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 严海荣 于 2012-9-21 09:31 编辑
  1. import java.util.*;

  2. public class CollectionsDemo {
  3.         public static void main(String[] args) {
  4.                 sortDemo();
  5.         }

  6.         public static void sortDemo() {
  7.                 List<String> list = new ArrayList<String>();
  8.                 list.add("abcd");
  9.                 list.add("aaa");
  10.                 list.add("z");
  11.                 list.add("kkkkk");
  12.                 list.add("qq");
  13.                 list.add("z");
  14.                 System.out.println(list);
  15.                 // Collections.sort(list);
  16.                 Collections.sort(list, new StrLenComparator());// 这句话Myeclipse出错了,该怎么解决?
  17.                 System.out.println(list);
  18.         }

  19.         class StrLenComparator implements Comparator<String> {

  20.                 public int compare(String s1, String s2) {
  21.                         if (s1.length() > s2.length())
  22.                                 return 1;
  23.                         if (s1.length() < s2.length())
  24.                                 return -1;
  25.                         return s1.compareTo(s2);
  26.                 }
  27.         }
  28. }
复制代码
Collections有个方法sort()可以传自己的比较器的,不知道哪里出错了。。。

7 个回复

倒序浏览
本帖最后由 皮卫凯 于 2012-9-21 01:18 编辑















  • import java.util.*;
  • public class CollectionsDemo {
  •         public static void main(String[] args) {
  •                 sortDemo();
  •         }
  •         public static void sortDemo() {
  •                 List<String> list = new ArrayList<String>();
  •                 list.add("abcd");
  •                 list.add("aaa");
  •                 list.add("z");
  •                 list.add("kkkkk");
  •                 list.add("qq");
  •                 list.add("z");
  •                 System.out.println(list);
  •                 // Collections.sort(list);
  •                 Collections.sort(list, new StrLenComparator());// 这句话Myeclipse出错了,该怎么解决?
  •                 System.out.println(list);
  •         }
  • }
  • class StrLenComparator 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);
  •                 }
  •         }




楼主注意看 提示错误,是无法从静态函数中引用非静态 变量this
主函数中:sortDemo(); 主函数是静态的,而 public static void sortDemo() 也是静态的,
Collections.sort(list, new StrLenComparator());// 这句话中的意思比较器中有用到this非静态的变量 所以会报错

    为了避免,把比较器放在外面即可。






    1、Collections.sort(list);         根据元素的自然顺序排序




    2、Collections.sort(list, new StrLenComparator());   根据比较器的顺序指定排序







回复 使用道具 举报
本帖最后由 王宝龙 于 2012-9-21 00:52 编辑

这是正确的代码  可以运行的 依我看 主要原因还是你将class StrLenComparator implements Comparator<String>这个类的定义放在了public class CollectionsDemo3类中,只要将StrLenComparator类定义在CollectionsDemo3类的外面就可以了!!
  1. import java.util.*;


  2. public class CollectionsDemo3
  3. {

  4.         public static void main(String[] args)
  5.                 {

  6.                 sortDemo();

  7.         }


  8.         public static void sortDemo()
  9.                 {

  10.                 List<String> list = new ArrayList<String>();

  11.                 list.add("abcd");

  12.                 list.add("aaa");

  13.                 list.add("z");

  14.                 list.add("kkkkk");

  15.                 list.add("qq");

  16.                 list.add("z");

  17.                 System.out.println(list);

  18.                 // Collections.sort(list);

  19.                 Collections.sort(list, new StrLenComparator());// 这句话Myeclipse出错了,该怎么解决?

  20.                 System.out.println(list);

  21.         }


  22. }
  23. class StrLenComparator implements Comparator<String>//放在CollectionsDemo3类的外面
  24.          {


  25.                 public int compare(String s1, String s2)
  26.                                 {

  27.                         if (s1.length() > s2.length())

  28.                                 return 1;

  29.                         if (s1.length() < s2.length())

  30.                                 return -1;

  31.                         return s1.compareTo(s2);

  32.                 }

  33.         }

复制代码
回复 使用道具 举报
本帖最后由 影子木木 于 2012-9-21 01:03 编辑

应该把代码这样改一下, 你把那个类写错地方了。
public class CollectionsDemo {
        public static void main(String[] args) {
                sortDemo();
        }
        public static void sortDemo() {
                List<String> list = new ArrayList<String>();
                list.add("abcd");
                list.add("aaa");
                list.add("z");
                list.add("kkkkk");
                list.add("qq");
                list.add("z");
                System.out.println(list);
                // Collections.sort(list);
                Collections.sort(list, new StrLenComparator());// 这句话Myeclipse出错了,该怎么解决?
                System.out.println(list);
        }
}
class StrLenComparator 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);
    }
}
回复 使用道具 举报


          原因是你的  sortDemo() 方法是静态的 ,静态的方法只能访问静态的成员  StrLenComparator类是非静态的,所以报错了

       import java.util.*;
public class ExceptionTest {
        public static void main(String[] args) {
                sortDemo();
        }

        public static void sortDemo() {
                List<String> list = new ArrayList<String>();
                list.add("abcd");
                list.add("aaa");
                list.add("z");
                list.add("kkkkk");
                list.add("qq");
                list.add("z");
                System.out.println(list);
                // Collections.sort(list);
                //Collections.sort(list, new StrLenComparator());// 这句话Myeclipse出错了,该怎么解决?
                Collections.sort(list, new ExceptionTest().new StrLenComparator());//你可以使用外部类调用内部类使用
                System.out.println(list);
        }

        //static class StrLenComparator implements Comparator<String> { //也可以把 StrLenComparator 类定义成静态的
        class StrLenComparator 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);
                }
        }

}

也可以将 StrLenComparator  定义在 ExceptionTest  类的外面


回复 使用道具 举报
懂了,谢谢大家了。
回复 使用道具 举报
      
在比较器前面加上 静态修饰符  就OK啦。
static class StrLenComparator 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);
                }
        }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马