JavaScript ---- 集合学习

news/2024/7/5 3:34:16

集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重 要特性是:

1、集合中的成员是无序的

2、集合中不允许相同成员存在

 

1 集合的定义、操作和属性

   1.1 集合的定义

  •      不包含任何成员的集合称为空集,全集则是包含一切可能成员的集合。
  •      如果两个集合的成员完全相同,则称两个集合相等。
  •     如果一个集合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集。

 1.2 对集合的操作

   • 并集

       将两个集合中的成员进行合并,得到一个新集合。

  • 交集

      两个集合中共同存在的成员组成一个新的集合。

  • 补集

   属于一个集合而不属于另一个集合的成员组成的集合。

2 Set类的实现

function Set() {
    this.dataStore = [];
    this.add = add;
    this.remove = remove;
    this.size = size;
    this.union = union;
    this.intersect = intersect;
    this.subset = subset;
    this.difference = difference;
    this.contains = contains;
    this.show = show;
}

// 添加数据   确保数据不重复   使用indexOf检查数据, 返回true 和false 得到插入的状态
function add(data) {
    if (this.dataStore.indexOf(data) < 0) {
        this.dataStore.push(data)
        return true;
    } else {
        return false;
    }
}

// 删除数据   工作原理类似 查找是否有数据 有 splice 移除
function remove(data) {
    let pos = this.dataStore.indexOf(data);
    if (pos > -1) {
        this.dataStore.splice(pos, 1);
        return true
    } else {
        return false;
    }
}
//在定义 union() 方法前,先需要定义一个辅助方法 contains(),该方法检查一个成员是否 属于该集合。
function contains(data) {
    if (this.dataStore.indexOf(data) > -1) {
        return true
    } else {
        return false
    }
}

// union() 方法执行并集操作,将两个集合合并成一个。
// 该方法首先将第一个集合里的成员悉数加入一个临时集合,然后检 查第二个集合中的成员,看它们是否也同时属于第一个集合。
// 如果属于,则跳过该成员, 否则就将该成员加入临时集合。
function union(set) {
    var tempSet = new Set();
    for (var i = 0; i < this.dataStore.length; ++i) {
        tempSet.add(this.dataStore[i]);
    }

    for (var i = 0; i < set.dataStore.length; ++i) {
        if (!tempSet.contains(set.dataStore[i])) {
            tempSet.dataStore.push(set.dataStore[i]);
        }
    }
    return tempSet;
}

// 求两个集合的交集
//每当发现第一 个集合的成员也属于第二个集合时,便将该成员加入一个新集合,这个新集合即为方法的 返回值。
function intersect(set) {
    var tempSert = new Set()
    for (var i = 0; i < this.dataStore.length; ++i) {
        if (set.contains(this.dataStore[i])) {
            tempSert.add(this.dataStore[i])
        }
    }
    return tempSert;
}

//subset() 方法首先要确定该集合的长度是否小于待比较 集合。
//如果该集合比待比较集合还要大,那么该集合肯定不会是待比较集合的一个子集。 
//当该集合的长度小于待比较集合时,再判断该集合内的成员是否都属于待比较集合。
//如果 有任意一个成员不属于待比较集合,则返回 false,程序终止。
//如果一直比较完该集合的 最后一个元素,所有元素都属于待比较集合,那么该集合就是待比较集合的一个子集,该 方法返回 true。

function size() {
    return this.dataStore.length;
}

function subset(set) {
    let a;
    if (this.size() > set.size) {
        return false
    } else {
        for (let i = 0; i < this.dataStore.length; ++i) {
            if (!set.contains(this.dataStore[i])) {
                return false;
            }
        }

    }
    return true;
}

// difference(),该方法返回一个新集合  该集合包含的是那些属于第一个集合但不属于第二个集合的成员
function difference(set) {
    var tempSet = new Set();
    for (var i = 0; i < this.dataStore.length; ++i) {
        if (!set.contains(this.dataStore[i])) {
            tempSet.add(this.dataStore[i]);
        }
    }
    return tempSet;
}


// 显示数据 
function show() {
    return this.dataStore
}

var cis = new Set();
var it = new Set();
cis.add("Clayton");
cis.add("Jennifer");
cis.add("Danny");
it.add("Bryan");
it.add("Clayton");
it.add("Jennifer");
var diff = new Set();
diff = cis.difference(it);
print("[" + cis.show() + "] difference [" + it.show()
    + "] -> [" + diff.show() + "]");

 


http://www.niftyadmin.cn/n/3655833.html

相关文章

火车站信息服务系统之LED大屏显示

最近比较忙&#xff0c;有一段时间没有更新blog了。一是忙隧道广告通信系统升级工作&#xff08;两个方案同时做&#xff0c;linux和wince方案&#xff09;&#xff0c;二是忙北京南站的信息服务系统&#xff0c;由于该项目我们介入的比较晚&#xff0c;主要是参与型厂商&#…

2020-12-06 instanceof 的原理,并代码实现

解答 &#xff1a; 遍历A的原型链&#xff0c;如果能找到B的prototype,返回true 找不到返回false const instanceOf (A, B) > {let p A;while (p) {if (p B.prototype) {return true}p p.__proto__;}return false }

嵌入式Linux编程--我的第一次艰难跋涉

其实从很早我就想深入学习Linux&#xff0c;但时间有限&#xff0c;并且Linux门槛挺高&#xff0c;不是很容易上手。最近由于隧道项目中用到嵌入式Linux&#xff08;Arm CPU上的Linux&#xff09;&#xff0c;并且提供硬件的单位针对Linux的编程收费很高&#xff0c;并且时间很…

2020-12-06 原型链面试题

明确foo 和 F的原型链&#xff0c;沿着原型链找A属性和B属性; console.log(foo.a) foo 是个对象 对象的原型链 是Object foo.a 的原型链上a 所以 输出 value a console.log(foo.b) undefined foo的原型链上 没有 F console.log(F.a) value a F 的原型链是f…

Windows Mobile远程控制软件Pocket Controller Pro简介

Pocket Controller Pro是一款优秀的PPC/Windows Mobile远程控制软件&#xff0c;功能非常强大&#xff0c;安装完毕后&#xff0c;不仅可通过同步信道控制远程设备&#xff0c;此外还可以通过TCP/IP操控远程设备&#xff0c;速度性能达到了极致&#xff0c;完全可以取代VS2005提…

2020-12-09 二叉树的先中后序遍历

递归版 先序遍历算法口诀 访问根节点对左子树进行先序遍历对右子树进行先序遍历 const preorder (root) > {if(!root) { return }console.log(root.val)preorder(root.left)preorder(root.right) } 中序遍历算法口诀 对根节点的左子树进行中序遍历访问根节点对跟几点的右…

.Net程序开发中一个较为隐蔽的GDI泄露探析

最近一直在调试第三方委托开发的医疗输液系统(我接手时&#xff0c;代码已经完成&#xff0c;原则上我只修改接口部分以适应我们的硬件即可&#xff0c;不过调试过程中&#xff0c;该程序本身问题暴露不少)&#xff0c;该系统用VB.net开发&#xff0c;该软件的图形界面是花费n多…

js --- 图的深度广度优先遍历

深度优先遍算法口诀 访问根节点对根节点的没有访问过的降临节点进行深度优先遍历 const graph {0:[1,2],1:[2],2:[0,3],3:[3] } const visited new Set() const dfs (n) >{console.log(n)visited.add(n)graph[n].forEach(c > {if (!visited.has(c)){dfs(c)}}); } dfs…