0
点赞
收藏
分享

微信扫一扫

数据结构,集合(笔记)

修炼之士 2022-01-10 阅读 77

1. 集合

  • 集合通常是由一组无序的,不能重复的元素构成
  • 集合是一种特殊的数组
    • 特殊之处在与里面的元素没有顺序,也不能重复
    • 没有顺序就代表不能通过下标去获取值,不能重复表示在一个集合中相同的数据只会存在一分
  • 在ES6中的Set就是一个集合

1.1 集合的封装

// 集合类
class Set {
  constructor() {
    this.obj = {}
    // 集合的长度
    this.size = 0
  }

  // 1.add(value):向集合添加一个新的项
  add(value) {
    if (this.has(value)) {
      throw new Error("集合中不能添加相同的属性")
    }

    this.obj[value] = value

    this.size++
  }

  // 2.remove(value):从集合移除对应值
  remove(value) {
    if (!this.has(value)) {
      throw new Error("集合中没有当前属性,删除不了")
    }

    delete this.obj[value]
    this.size--
  }

  // 3.has(value):查询对应数据,有返回true,没有返回false
  has(value) {
    // hasOwnProperty():会查看当前对象中是否有这个属性,返回布尔值
    return this.obj.hasOwnProperty(value)
  }

  // 4.clear():清空集合
  clear() {
    this.obj = {}
    this.size = 0
  }

  // 5.size():返回集合元素的数量,与数据的length相似
  size() {
    return this.size
  }

  // 6.values():返回一个包含集合中所有值的数组
  values() {
    // Object.keys() 方法会把当前对象变为可枚举属性组成的数组,并返回
    return Object.keys(this.obj)
  }

  // 集合间的操作
  // 1.union(otherSet):返回两个集合的并集(合并,相等的去重)
  union(otherSet) {
    let newSet = new Set()

    // 以数组的形式存储[当前]集合
    let values = this.values()

    for (let i = 0; i < values.length; i++) {
      newSet.add(values[i])
    }

    // 以数组的形式存储[传入]的集合
    let otherValues = otherSet.values()
    for (let i = 0; i < otherValues.length; i++) {
      // 两个集合中有没有相同的属性
      if (!newSet.has(otherValues[i])) {
        // 没有就添加
        newSet.add(otherValues[i])
      }
    }
    return newSet
  }

  // 2.intersection(otherSet):返回两个集合的交集(两个集合的公共部分)
  intersection(otherSet) {
    let newSet = new Set()

    let values = this.values()
    for (let i = 0; i < values.length; i++) {
      let item = values[i]
      // 遍历当前集合,查看传入的集合是否和它有相同的,有就把相同的添加到要返回的集合中
      if (otherSet.has(item)) {
        newSet.add(item)
      }
    }
    return newSet
  }

  // 3.difference(otherSet):返回两个集合的差集(也就是返回当前集合,剔除和传入集合的公共部分)
  difference(otherSet) {
    let newSet = new Set()

    let values = this.values()
    for (let i = 0; i < values.length; i++) {
      let item = values[i]
      // 遍历当前集合,查看传入的集合是否和它有不同的,有就添加到要返回的集合中
      if (!otherSet.has(item)) {
        newSet.add(item)
      }
    }
    return newSet
  }

  // 4.subset(otherSet):查看传入的集合,是不是为当前集合的子集(也就是传入元素中的属性,当前集合中必须都有)
  subset(otherSet) {
    let otherValues = otherSet.values()
    for (let i = 0; i < otherValues.length; i++) {
      // 查看传入集合中的元素是不是都在当前集合中
      // 有一个不在就表示不为子集
      if (!this.has(otherValues[i])) {
        return false
      }
    }
    return true
  }
}
举报

相关推荐

0 条评论