黑马程序员技术交流社区

标题: 关于TreeSet 字符串排序问题 [打印本页]

作者: lurenge    时间: 2015-4-14 10:21
标题: 关于TreeSet 字符串排序问题
  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

作者: 机智的黄图哥    时间: 2015-4-14 11:00
你可以直接在TreeSet构造里面实现比较器 或者自然循序  为什么要搞个对象
作者: 突然世界晴    时间: 2015-4-14 11:12
本帖最后由 突然世界晴 于 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:23
本帖最后由 火七君 于 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. }
复制代码



作者: 段黄军    时间: 2015-4-14 11:29
你直接通过遍历器或是增强for循环就可以排序了
作者: liaohongjie    时间: 2015-4-14 11:33
Object的O要大写
作者: lurenge    时间: 2015-4-14 17:06
知道了啊 ,谢谢大家 大小写弄错了




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