简单说一说数据结构——集合

原创 2017年03月23日 16:37:30

迄今为止,我们已经学习了数组(列表)、栈、队列和链表(及其变种)等顺序数据结构。

这一节我们讲讲集合。集合的定义是由一组无序且唯一(即不能重复)的项组成的。不包含任何元素的集合就叫做空集。上高中那会,我们都接触过集合,其中一些概念比如交集、并集、差集等等。

ECMAScript6也实现了集合这种数据结构——Set类。而我们用ECMAScript5来实现。也可以为看Set时做铺垫。

首先,集合Set类的骨架是

function Set(){
    var items = {}; 
}

与之前不同的是,这里使用的是对象而不是数组来表示集合。因为对象和集合有一个共同点,Javascript不允许一个键指向两个不同的属性,也保证了集合里的元素都是唯一的。

集合Set类中有一些可用的方法:
add(value):向集合添加一个新的项。
remove(value):从集合中移除一个值。
has(value):判断集合中是否存在某个值。
clear():移除集合中所有的项。
size():返回集合中所包含元素的数量。
values():返回一个包含集合中所有值的数组。

实现起来借助对象也是非常easy的:

    this.has = function(value){
        return items.hadOwnProperty(value);     //return value in items;
    };
    this.add = function(value){
        if(!this.has(value)){
            items[value] = value;
            return true;
        }
        return false;
    };
    this.remove = function(value){
        if(this.has(value)){
            delete items[value];
            return true;
        }
        return false;
    };
    this.clear = function(){
        items = {};
    };
    // this.size = function(){
    //  return Object.keys(items).length;
    // };
    this.sizeLegacy = function(){
        var count = 0;
        for(var prop in items){
            if(items.hadOwnProperty(prop)){
                count++;
            }
        }
        return count;
    };
    // this.values = function(){
    //  return Object.keys(items);
    // }
    this.valuesLegacy = function(){
        var keys = [];
        for(var key in items){
            if(items.hadOwnProperty(key)){
                keys.push(key);
            }
        }
        return keys;
    };

以上代码值得注意的点有:在has方法中,hasOwnProperty函数会返回对象是否有某个特定属性。有就返回true,没有就返回false。其次在size方法中,提供了两种方式。第一种方式是利用keys函数,它返回一个包含给定对象所有属性的数组。支持该方法的浏览器有IE9+、Firefox4+、Chrome5+、Opera12+和Safari5+。要使size方法适用所有浏览器,那么就使用sizeLegacy函数。values函数同理。

了解完集合的基本概念和操作。下面讲一讲集合之间的关系及操作:
并集:对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。
交集:对于给定的两个集合,返回一个包含两个集合中共有元素的新集合。
差集:对于给定的两个集合,返回一个包含所有存在于第一个集合且不存在于第二个集合的元素的新集合。
子集:验证一个给定集合是否是另一个集合的子集。

并集用一张图表示:
并集

    this.union = function(otherSet){
        var unionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            unionSet.add(values[i]);
        }

        for(var i = 0 ; i < otherSet.length ; i++){
            unionSet.add(otherSet[i]);
        }

        return unionSet;
    };

交集用一张图表示:
交集

this.intersection = function(){
        var intersectionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(otherSet.has(values[i])){
                intersectionSet.add(values[i]);
            }
        }
        return intersectionSet;
    };

差集用一张图表示
差集

this.difference = function(otherSet){
        var differenceSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(!otherSet.has(values[i])){
                differenceSet.add(values[i]);
            }
        }
        return differenceSet;
    };

最后一个子集:
子集

this.subset = function(otherSet){
        if(this.size() > otherSet.size()){
            return false;
        }else{
            var values = this.values();
            for(var u = 0 ; i < values.length ; i++){
                if(!otherSet.has(values[i])){
                    return false;
                }
            }
            return true;
        }
    };

集合讲到这里也就完了,还是比较简单的一种结构。含测试代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

数据结构学习之集合

注:本文的主要目的是为了记录自己的学习过程,也方便与大家做交流。转载请注明来自: http://blog.csdn.net/ab198604 另:本文需要单向链表的知识,如果不了解单向链表,可...

数组、链表等常用数据结构和集合浅解(java)

数组、链表等常用数据结构和集合浅解(java) 脑子转了一圈,巴拉巴拉的写了一大堆,本来今天步行者打骑士的比赛在上半场已经花了,步行者领先20多分,然而詹姆斯一个大大大号三双强行把比分拉回来还赢了...

集合类(数据结构图、集合图、集合之间的比较)

数据结构图         集合类图         .容器中装的都是对象,因为它要把对象放到堆上面,但是1.5后就可以自动包装   map.put...

常用集合的底层数据结构和实现-Map

常用集合的底层数据结构和实现  常见的底层数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的(当然也不能绝对的...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

c语言实现通用数据结构(四):通用集合(HashSet)

这是在通用链表的基础上实现的椎栈,关于链表的实现参见:http://blog.csdn.net/swwlqw/article/details/22498833。 注意集合中只存储了指针,没有储存实际的...
  • swwlqw
  • swwlqw
  • 2014年03月31日 14:09
  • 2170

简单说一说数据结构——栈

数组是Javascript里面非常灵活的数据结构,如何用数组来构建栈?栈是一种遵从后进先出(LIFO)的有序集合。新添加的或删除的元素都保存在栈的末尾,称为栈顶,另一端就叫栈底。在栈里,新元素都靠近栈...

简单说一说数据结构——队列

上一次我们已经学习了栈。今天我们来说一说队列。队列和栈非常类似,都是非常容易理解的数据结构。队列是遵循先来先服务原则的一组有序的项。队列在尾部添加新元素,并从顶部移除元素。在现实中,最常见的队列的例子...

简单说一说数据结构——链表

数组是一种非常简单的存储数据序列的数据结构。平时开发中,要存储多个元素,数组是最常用的数据结构。但是,在大多数语言中,数组的大小是固定的。从数组的起点或中间插入或移除项的成本非常高,因为需要频繁地移动...

说一说用户体验的主导性(微拍)——一款微信产品

最近微信公共平台很火,我们公司也在做微信公共平台开发。我由于编程技术不行,我被安排在了测试岗位上。公司和另外一家公司合作,做了一款微拍的应用,主要功能有三点: 1、  有一段商家视频,在机器上循环播...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单说一说数据结构——集合
举报原因:
原因补充:

(最多只允许输入30个字)