黑马程序员技术交流社区

标题: 帮忙看看代码 [打印本页]

作者: Zhang_qian    时间: 2012-5-15 13:42
标题: 帮忙看看代码
我想要的结果是
a
aa
aaa
bbb
ccc但是结果只有三个,不知道怎么回事?请高手指点一下
代码如下:
import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet(new MyTer());
                ts.add("a");
                ts.add("aa");
                ts.add("bbb");
                ts.add("aaa");
                ts.add("ccc");
                Iterator it=ts.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next());
                }
        }
}
class MyTer implements Comparator
{
        public int compare(Object o1,Object o2)
        {
                String s1=(String)o1;
               
                String s2=(String)o2;
                int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
               
                return num;
}        }
作者: 古银平    时间: 2012-5-15 13:54
注意:TreeSetDemo.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。
怎么是这样的
作者: 李哲    时间: 2012-5-15 13:57
本帖最后由 李哲 于 2012-5-15 14:00 编辑


import java.util.*;
class TreeSetDemo
{
        public static void main(String[] args)
        {
                TreeSet ts=new TreeSet(new MyTer());
                ts.add("a");
                ts.add("aa");
                ts.add("bbb");
                ts.add("aaa");
                ts.add("ccc");
                Iterator it=ts.iterator();
                while(it.hasNext())
                {
                        System.out.println(it.next());
                }
        }
}
class MyTer implements Comparator
{
        public int compare(Object o1,Object o2)
        {
                String s1=(String)o1;
               
                String s2=(String)o2;
               
            
                if(new Integer(s1.length()).compareTo(new Integer(s2.length()))!=0)
                        return new Integer(s1.length()).compareTo(new Integer(s2.length()));
                else
                        return         s1.compareTo(s2);
               
         }      
                 
}      
        
作者: 付左军    时间: 2012-5-15 14:01
你的比较器是以长度为标准的,当其长度一致时,被认定为重复,所以没有打印
作者: 孙安庆    时间: 2012-5-15 14:30
古银平 发表于 2012-5-15 13:54
注意:TreeSetDemo.java 使用了未经检查或不安全的操作。
注意:要了解详细信息,请使用 -Xlint:unchecked  ...

TreeSet的构造函数没有使用泛型,不影响正常运行
作者: 田林    时间: 2012-5-15 19:08
本帖最后由 田林 于 2012-5-15 19:10 编辑

楼主实现了Comparator接口,改变了集合ts 中元素的比较方式。

int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));    // int compareTo(Integer anotherInteger) 方法是在数字上比较两个 Integer 对象。

而“aaa”“bbb”“ccc”三个字符串的长度相等,所以他们比较时的结果为0.也就是compare方法的返回值为0,这时程序将认为这两个值相同。

而TreeSet集合中的元素不能重复,所以“bbb”“ccc”将无法存入集合。

可将compare方法改为:
public int compare(Object o1,Object o2)
        {
                String s1=(String)o1;
                String s2=(String) o2;
               
                return s1.compareTo(s2);
               
        }     
这时就OK了。当然用泛型的话更方便,可以省略类型转换。楼主可以看一下毕老师讲泛型的视频。
作者: Zhang_qian    时间: 2012-5-15 19:25
田林 发表于 2012-5-15 19:08
楼主实现了Comparator接口,改变了集合ts 中元素的比较方式。

int num=new Integer(s1.length()).compareT ...

谢谢讲解
作者: 高云飞    时间: 2012-5-15 19:31
付左军 发表于 2012-5-15 14:01
你的比较器是以长度为标准的,当其长度一致时,被认定为重复,所以没有打印 ...

正解:):D




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