`
sunlujing
  • 浏览: 177932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Set 如何比较重复元素

 
阅读更多

HashSet部分: 

   以下以HashSet为例进行分析。 
   从Hashset类的主体部分: 
public class HashSet<E> extends AbstractSet<E> 
     implements Set<E>, Cloneable, java.io.Serializable 

  static final long serialVersionUID = -5024744406713321676L; 
  private transient HashMap<E,Object> map; 
  // Dummy value to associate with an Object in the backing Map 
  //这是每个键所指的对像 
  private static final Object PRESENT = new Object(); 


     public HashSet() { 
   map = new HashMap<E,Object>(); 
      } 
     public boolean add(E o) { 
   return map.put(o, PRESENT)==null; 
      } 
    //以下省略.......... 
    } 

        public HashSet() { 

  map = new HashMap<E,Object>(); 
    

   可以看到HashSet使用了HashMap作为其Map保存“键-值”对。 
   
   请看示例程序4: 
import java.util.*; 

public class SetTest4 { 
public static void main(String[] args){ 
  Set set = new HashSet(); 
  set.add(new SetElement4("aa")); 
  set.add(new SetElement4("aa")); 
  set.add(new SetElement4("bb")); 
  System.out.println(set); 

static class SetElement4{ 
  String s; 
  public SetElement4(String s){ 
   this.s =  s; 
  } 
  public String toString(){ 
   return s; 
  } 
  public boolean equals(Object obj) { 
   return s.equals(((SetElement4)obj).s); 
  } 



   运行结果: 
   [bb, aa, aa] 
   没有“示例程序1”中的java.lang.ClassCastException,但是运行结果似乎不对,因为有两个“aa”。 
   
   请看示例程序5: 
import java.util.*; 
public class SetTest5 { 
  public static void main(String[] args){ 
   Set set = new HashSet(); 
   set.add(new SetElement5("aa")); 
   set.add(new SetElement5("aa")); 
   set.add(new SetElement5("bb")); 
   System.out.println(set); 
  } 
  static class SetElement5{ 
   String s; 
   public SetElement5(String s){ 
    this.s =  s; 
   } 
   public String toString(){ 
    return s; 
   } 
   public boolean equals(Object obj) { 
    return s.equals(((SetElement5)obj).s); 
   } 
   public int hashCode() { 
    //return super.hashCode(); 
    return s.hashCode(); 
   } 
  } 

    运行结果: 
    [bb, aa] 
    这就对了。“示例程序4”和“示例程序5”有什么区别?是SetElement5重写了hashCode方法。 
    
    可见HashSet中是采用了比较元素hashCode的方法来判断元素是否相同(duplicate),而不是采用其他类似equals之类的东东来判断。 
    
    说了这么多,那java类库中到底有没有根据equals来判断元素是否相同(duplicate)的Set呢?请看下文。 
2.2、CopyOnWriteArraySet部分: 
   类CopyOnWriteArraySet是java.util.concurrent包中的一个类,所以它是线程安全的。 
   CopyOnWriteArraySet是使用CopyOnWriteArrayList作为其盛放元素的容器。当往CopyOnWriteArrayList添加新元素,它都要遍历整个List,并且用equals来    比较两个元素是否相同。 

   请看示例程序6: 
import java.util.*; 
import java.util.concurrent.*; 
public class SetTest6 { 
  public static void main(String[] args){ 
   Set set = new CopyOnWriteArraySet(); 
   set.add(new SetElement6("aa")); 
   set.add(new SetElement6("aa")); 
   set.add(new SetElement6("bb")); 
   System.out.println(set); 
  } 
  static class SetElement6{ 
   String s; 
   public SetElement6(String s){ 
    this.s =  s; 
   } 
   public String toString(){ 
    return s; 
   } 
   public boolean equals(Object obj) { 
    return s.equals(((SetElement6)obj).s); 
   } 
  } 

   运行结果: 
   [aa, bb] 
   好了,一切搞定!! 

3、总结: 
   Javadoc中的一些描述可能是不准确的,大家要当心了! 
   
   Set中实现元素互异的各种方法差异很大,大致可以分为三种:使用equals,使用hashCode,使用compareTo。但是我还没有发现采用“判断地址空间是否相同”来判断元素是否相同的类,当然我们可以用现有的三种方法来实现“判断地址空间是否相同”。 
   
   综上所述,我们可以总结出使用Set的三种不同的情形:(以下假设元素类为Element) 
   A、如果想使用Element的equals方法来判断元素是否相同,那么可以使用CopyOnWriteArraySet来构造类的实体。 
   B、如果Element实现了Comparable接口,而且想使用compareTo方法来判断元素是否相同,那么可以使用TreeSet来构造类的实体。 
   C、如果想使用判断hashCode是否相同的方法来判断元素是否相同,那么可以使用HashSet来构造类的实体

发表于 @ 2009年12月17日 17:


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pss360/archive/2009/12/17/5026516.aspx

分享到:
评论

相关推荐

    set集合判断集合中是否有无元素-Python入门教程笔记(五)集合(set)及函数.pdf

    set集合判断集合中是否有⽆元素_Python⼊门教程笔记(五) 集合(set)及函数 三九、什么是 三九、什么是set 在前⾯,我们学习了dict,知道dict的key是不重复的,当我们往dict⾥添加⼀个相同key的value时,新的value...

    java集合知识-map、set等

    如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。 记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如...

    利用Set集合去除List集合中重复元素、字符串中的重复子串

    一:Set集合去掉List集合中重复元素 public static void main(String[] args) { //利用set集合 去除ArrayList集合中的重复元素 ArrayList list = new ArrayList(); list.add("1"); list.add("1"); list.add("2...

    基于Python的重复元素判断.docx

    #set会生成一个元素无序且不重复的可迭代对象,也就是我们常说的去重 if len(set_lst)==len(lst): print('列表里的元素互不重复!') else: print('列表里有重复的元素!') 二、用append的方式把原列表中的元素添加...

    C++ Set(集合)

    set 是一个内部自动有序且不含重复元素的容器。 set 最主要的作用就是自动去重并按升序排序,适用于需要去重但是又不方便直接开数组的情况。 set 中的元素是唯一的,其内部采用“红黑树”实现。 注:本文章只列举 ...

    java中set、list和map的使用方法实例

    // set容器中的对象不允许重复 // set容器接口的实现类有HashSet和 LinkedHashSet两个 // HashSet不保证迭代顺序, LinkedHashSet按照元素插入的顺序迭代. // 学习List对象容器的使用 // List容器中的对象允许重复 ...

    set.list.map接口

    1. Set(集合)里面的元素是无序的,但没有重复的元素 2. 两个实现类HashSet(LinkHashSet)和TreeSet,TreeSet有排序功能(Set set=new TreeSet();set.add(new Integer(8)); set.add(new Integer(4)); set.add(new ...

    测量程序编制 - python 51数据类型:Set(集合)-对称差集.pptx

    set1 -- 必需,要查找相同元素的集合,可以是任何序列 若是字典,按键比较 返回值:返回一个新的集合 set1={1,2,3} set2={3,4,5,2} list1=[2,3] dict1={2:9,'b':10} set3=set1.symmetric_difference(set2) print

    测量程序编制 - python 49数据类型:Set(集合)-并集.pptx

    即包含了所有集合的元素,重复的元素只会出现一次语法: set.union(set1, set2...)set1 -- 必需,要查找相同元素的集合set2 -- 可选,可以是任何序列,可以多个,多个使用逗号 , 隔开 若是字典,按键比较返回值:...

    Python语言基础:set集合运用.pptx

    set集合是一个元素无序不重复的序列,可以使用大括号{}或set()函数创建集合。 语法格式: parame={value01,value02,………} 或 set(value) 实例:创建set集合。 #第一种创建set集合 basket={"apple","orange","pear...

    Java集合框架Set接口.pdf

    Java集合框架中的Set接口是一种不允许包含重复元素的集合。Set接口继承自Collection接口,因此它具有Collection接口定义的所有方法。同时,Set接口还具有自己的特殊方法,例如:添加元素、删除元素、判断元素是否...

    集合概述set、List、Map

     Set – 对象之间没有指定的顺序,不允许重复元素  List– 对象之间有指定的顺序,允许重复元素,并引入位置下标。  Map – 接口用于保存关键字(Key)和数值(Value)的集合,集合中的每个对象加入时都提供...

    List、Set、Map的特点及遍历方法

    set元素放入无顺序 ,不可重复元素 set与list的对比 set检查元素效率低下,删除和插入的效率高,不会引起元素位置改变 list和数组相似,list可实现动态增长,查找元素效率高,插入和检查的效率低,会

    测量程序编制 - python 48数据类型:Set(集合)-交集.pptx

    Set(集合)——交集 ...set1 -- 必需,要查找相同元素的集合 set2 -- 可选,可以是任何序列,可以多个,多个使用逗号 , 隔开 若是字典,按键比较 返回值:返回一个新的集合 set1={1,2,3} set2={3,4,5,2} list1=

    Python学习笔记_8:set 函数的使用方法

    2、set自动合并相同元素 &gt;&gt;&gt; I = set([5,2,3,5,2]) &gt;&gt;&gt; print(I) {2,3,5} 3、集合中元素是无序的 &gt;&gt;&gt; I = set([1,2,3,4,5]) &gt;&gt;&gt; I[1] %%就会报错 Traceback (most recent call last): File "", lin

    测量程序编制 - python 50数据类型:Set(集合)-差集.pptx

    set1 -- 必需,要查找相同元素的集合 set2 -- 必需,可以是任何序列,可以多个,多个使用逗号 , 隔开 若是字典,按键比较 返回值:返回一个新的集合 set1={1,2,3} set2={3,4,5,2} list1=[2,3] dict1={2:9,'b':10} ...

    Python简单删除列表中相同元素的方法示例

    本文实例讲述了Python简单删除列表中相同元素的方法。分享给大家供大家参考,具体如下: 去除列表中重复的元素,非常简单,直接上代码: a = [11, 21, 3, 4, 3, 2, 5] b = list(set(a)) print(a) print(b) 运行...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    主要介绍了从源码的角度浅析HashMap、TreeMap元素的存储和获取元素的逻辑;从Map与Set之间的关系浅析常用的Set中元素的存储和判断是否重复的逻辑,需要的朋友可以参考下

    219. 存在重复元素 II(set+滑窗)1

    否则,返示例 1:示例 2:示例 3:def containsNearbyDuplicate(self, nums: List[int], k: int) -&gt;

    测量程序编制 - python 52数据类型:Set(集合)-函数.pptx

    判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。 Set(集合)——函数 序号 方法 描述 10 issubset() 判断指定集合是否为该方法参数集合的子集。 11 issuperset() 判断该方法的参数集合是否为...

Global site tag (gtag.js) - Google Analytics