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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package cn.javastudy.p3.Collection.copy;
  2. import java.awt.peer.SystemTrayPeer;
  3. import java.util.*;
  4. @SuppressWarnings("unused")
  5. public class MyVector3 {
  6.         public static void main(String[] args)
  7.         {
  8.                 MyComparator com=new MyComparator();
  9.                 TreeSet<myInteger> v=new TreeSet<myInteger>(com);
  10.                 //向ArrayList中添加元素
  11.                 v.add(new myInteger(10));
  12.                 v.add(new myInteger(40));
  13.                 v.add(new myInteger(20));
  14.                 v.add(new myInteger(50));
  15.                 v.add(new myInteger(50));
  16.                 Iterator<myInteger> it=v.iterator();
  17.                 while(it.hasNext())
  18.                         System.out.println(it.next().getIt());
  19.         }
  20. }
  21. class myInteger extends abc
  22. {
  23.         public Integer getIt() {
  24.                 return it;
  25.         }
  26.         public myInteger(Integer it) {
  27.                 this.it = it;
  28.         }
  29.         public boolean equals(Object obj) {
  30.                 return it.equals(((myInteger)obj).it);
  31.         }
  32.        
  33.        
  34. }
  35. class abc
  36. {
  37.         Integer it=null;
  38. }
  39. class MyComparator implements Comparator<abc>
  40. {

  41.         @Override
  42.         public int compare(abc o1, abc o2) {
  43.                 if(o1.equals(o2))
  44.                         return 0;
  45.                 return o1.it<o2.it?-1:1;
  46.         }
  47. }
  48. /*
  49. 10
  50. 20
  51. 40
  52. 50
  53. */
复制代码
不重写如下

  1. package cn.javastudy.p3.Collection.copy;
  2. import java.awt.peer.SystemTrayPeer;
  3. import java.util.*;
  4. @SuppressWarnings("unused")
  5. public class MyVector3 {
  6.         public static void main(String[] args)
  7.         {
  8.                 MyComparator com=new MyComparator();
  9.                 TreeSet<myInteger> v=new TreeSet<myInteger>(com);
  10.                 //向ArrayList中添加元素
  11.                 v.add(new myInteger(10));
  12.                 v.add(new myInteger(40));
  13.                 v.add(new myInteger(20));
  14.                 v.add(new myInteger(50));
  15.                 v.add(new myInteger(50));
  16.                 Iterator<myInteger> it=v.iterator();
  17.                 while(it.hasNext())
  18.                         System.out.println(it.next().getIt());
  19.         }
  20. }
  21. class myInteger extends abc
  22. {
  23.         public Integer getIt() {
  24.                 return it;
  25.         }
  26.         public myInteger(Integer it) {
  27.                 this.it = it;
  28.         }
  29. //        public boolean equals(Object obj) {
  30. //                return it.equals(((myInteger)obj).it);
  31. //        }
  32.        
  33.        
  34. }
  35. class abc
  36. {
  37.         Integer it=null;
  38. }
  39. class MyComparator implements Comparator<abc>
  40. {

  41.         @Override
  42.         public int compare(abc o1, abc o2) {
  43.                 if(o1.equals(o2))
  44.                         return 0;
  45.                 return o1.it<o2.it?-1:1;
  46.         }
  47. }

复制代码
使用TreeSet存贮对像时,还得重写对像的equals方法,不重写的话,有重复的元素

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
不重写返回:
20
40
50
50
回复 使用道具 举报
。。。看看两者代码就知道,TreeSet的构造函数里面有一个参数是比较器,而看这个比较器的代码可以知道,他调用了容器里面元素的equals方法,而如果不重写equals方法,则调用的是从Object继承而来的那个用"=="来实现比较的原来方法,比较值(地址值或者数值),所以基本没什么意义。在代码里面每new一个对象他们的地址值基本不会一样,这样必然存在重复元素。这是实现无重复元素的第一种方式,让容器具有比较性。一般使用内部类实现就行了,也比较常用。
第2种方式,就是让对象具有比较性,去实现Comparable接口,然后实现compareTo方法即可。TreeSet会根据这个方法的返回值决定元素的位置,以及要不要添加他,也就去掉了重复元素。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
不重写的话是比较内存地址,重写的话,是自己定义比较的内容,一般都建议重写
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马