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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© lurenge 中级黑马   /  2015-4-14 10:21  /  750 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;
  2. class  TreeSetTest
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 TreeSet ts = new TreeSet(new strlencomparator());
  7.                 ts.add("abc");
  8.                 ts.add("aac");
  9.                 ts.add("abdc");
  10.                 ts.add("accad");
  11.                 ts.add("abca");
  12.                 Iterator it = ts.iterator();
  13.                 while (it.hasNext())
  14.                 {
  15.                         System.out.println(it.next());
  16.                 }
  17.         }
  18.         class strlencomparator implements Comparator
  19.         {
  20.                 public int compare(object o1,object o2)
  21.                 {
  22.                         String s1 = (String)o1;
  23.                         String s2 = (String)o2;
  24.                         if(s1.length() > s2.length())
  25.                                 return 1;
  26.                         if(s1.length() < s2.length())
  27.                                 return -1;
  28.                         return 0;
  29.                 }
  30.         }
  31. }
复制代码
以上代码错误如下:

QQ截图20150414101846.png (9.67 KB, 下载次数: 13)

QQ截图20150414101846.png

6 个回复

倒序浏览
你可以直接在TreeSet构造里面实现比较器 或者自然循序  为什么要搞个对象
回复 使用道具 举报
本帖最后由 突然世界晴 于 2015-4-14 11:17 编辑

public int compare(object o1,object o2)
对象第一个字母都是大写,java区分大小写的
改成Object o1 和Object o2另外你的strlencomparator类是内部类
所以传入形参的时候不能用new strlencomparator,要改为new TreeSetTest().new strlencomparator()


或者将strlencomparator类放在TreeSetTest类外面
回复 使用道具 举报
本帖最后由 火七君 于 2015-4-14 11:30 编辑

首先你不想用String中的自然排序,你想要按照字符串长度进行排序。
这时你要注意
长度相同的则视为同一个元素,所以打印结果会是三个元素。

下面是错误纠正
这个题中有两个错误,
第一个非常明显就是楼上说的,Object这个首字母要大写。因为这是个类,类名首字母大写这是最基础的语法了。
第二个错误是main方法读取调用方法是从上往下自然顺序调用的,你把比较器类写在下面,上面的是读不到的,所以会报异常。
       解决方案:1、你把比较器另写一个类,用public 修饰,注意如果比较器类不在同一个包中注意导包。                        2、 如楼上所说用       new 外部类名().new 内部类名()      创建对象也可以
                        3、 第二种解决方法就是把比较器类写到main方法以下就可以了。

  1. class  TreeSetTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 class strlencomparator implements Comparator
  7.                 {
  8.                         
  9.                         public int compare(Object o1, Object o2) {
  10.                                 String s1 = (String)o1;
  11.                                 String s2 = (String)o2;
  12.                                 if(s1.length() > s2.length())
  13.                                         return 1;
  14.                                 else if(s1.length() < s2.length())
  15.                                         return -1;
  16.                                 else return 0;
  17.                         }
  18.                 }
  19.                 TreeSet ts = new TreeSet(new strlencomparator());
  20.                 ts.add("abc");
  21.                 ts.add("aac");
  22.                 ts.add("abdc");
  23.                 ts.add("accad");
  24.                 ts.add("abca");
  25.                 Iterator it = ts.iterator();
  26.                 while (it.hasNext())
  27.                 {
  28.                         System.out.println(it.next());
  29.                 }
  30.         }
  31. }
复制代码


回复 使用道具 举报
你直接通过遍历器或是增强for循环就可以排序了
回复 使用道具 举报
Object的O要大写
回复 使用道具 举报 1 0
知道了啊 ,谢谢大家 大小写弄错了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马