javascript数据结构与算法(笔记)---集合、交集、并集、子集

<script>
    //以Set类的骨架
    /*
    * add(value) 向集合添加一个新的项
    * remove(value) 从集合移除一个值
    * has(value) 如果值在集合中,返回true,否则返回false
    * clear() 移除集合中所有的项
    * size() 返回集合所包含元素的数量
    //size方法的实现有三种形式:1、使用length变量,在add和remove的时候,控制它,2、Object.keys(items).length;
    //Object类的keys方法,返回一个包含指定对象所有属性的数组,目前该方法有浏览器的兼容性
    * values() 返回一个包含集合所有值的数组
    */
    function Set() {
      var items = {};

      this.has = function(value) {
        return value in items; // 也可以这样实现:return items.hasOwnProperty(value)
      }

      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() {
        var count = 0;
        for(var prop in items) {
          if(items.hasOwnProperty(prop)) {
            ++count;
          }
        }
        return count;
        // 不能简单地使用for-in语句遍历items对象的属性,递增count变量的值。还需要使用has方法验证items对象具有该属性
        // 因为对象的原型包含了额外的属性(既有对象自身的,也有Object类的)
      }

      this.values = function() {
        // 可以return Object.keys(items);
        var keys = [];
        for(var key in items) {
          keys.push(key);
        }
        return keys;
      }

      this.union = function(otherSet) { //并集
        var unionSet = new Set();
        var values = this.values();
        for(var i = 0; i < values.length; i++) {
          unionSet.add(values[i]);
        }

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

      this.intersection = function(otherSet) { //交集
        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() { // 差集
        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 i = 0; i < values.length; i++) {
            if(!otherSet.has(values[i])) {
              return false;
            }
          }
          return true;
        }
      }
    }

    var setA = new Set();
    setA.add(1);
    setA.add(2);
    setA.add(3);

    var setB = new Set();
    setB.add(3);
    setB.add(4);
    setB.add(5);
    setB.add(6);

    var setAB = setA.union(setB);
    console.log(setAB.values());
  </script>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值