javascript基础学习系列九十七:定义正式集合操作

从各方面来看,Set 跟 Map 都很相似,只是 API 稍有调整。唯一需要强调的就是集合的 API 对自 身的简单操作。很多开发者都喜欢使用 Set 操作,但需要手动实现:或者是子类化 Set,或者是定义一 个实用函数库。

要把两种方式合二为一,可以在子类上实现静态方法,然后在实例方法中使用这些静态 方法。在实现这些操作时,需要考虑几个地方。

  • 某些 Set 操作是有关联性的,因此最好让实现的方法能支持处理任意多个集合实例。
  • Set 保留插入顺序,所有方法返回的集合必须保证顺序。
  • 尽可能高效地使用内存。扩展操作符的语法很简洁,但尽可能避免集合和数组间的相互转换能够节省对象初始化成本。
  • 不要修改已有的集合实例。union(a, b)或 a.union(b)应该返回包含结果的新集合实例。
   class XSet extends Set {
      union(...sets) {
        return XSet.union(this, ...sets)
      }
      intersection(...sets) {
        return XSet.intersection(this, ...sets);
}
      difference(set) {
        return XSet.difference(this, set);
}
      symmetricDifference(set) {
        return XSet.symmetricDifference(this, set);
}
      cartesianProduct(set) {
        return XSet.cartesianProduct(this, set);
}
      powerSet() {
        return XSet.powerSet(this);
}

// 返回两个或更多集合的并集 static union(a, ...bSets) {
  const unionSet = new XSet(a);
  for (const b of bSets) {
    for (const bValue of b) {
      unionSet.add(bValue);
} }
  return unionSet;
}
// 返回两个或更多集合的交集
static intersection(a, ...bSets) {
  const intersectionSet = new XSet(a);
  for (const aValue of intersectionSet) {
    for (const b of bSets) {
      if (!b.has(aValue)) {
        intersectionSet.delete(aValue);
  return intersectionSet;
}
// 返回两个集合的差集
static difference(a, b) {
  const differenceSet = new XSet(a);
  for (const bValue of b) {
    if (a.has(bValue)) {
      differenceSet.delete(bValue);
    } }
}
   }8 }
  return differenceSet;
}
// 返回两个集合的对称差集
static symmetricDifference(a, b) {
// 按照定义,对称差集可以表达为
  return a.union(b).difference(a.intersection(b));
}
// 返回两个集合(数组对形式)的笛卡儿积
// 必须返回数组集合,因为笛卡儿积可能包含相同值的对 static cartesianProduct(a, b) {
  const cartesianProductSet = new XSet();
  for (const aValue of a) {
    for (const bValue of b) {
cartesianProductSet.add([aValue, bValue]); 12
} }
  return cartesianProductSet;
}
// 返回一个集合的幂集 static powerSet(a) {
  const powerSet = new XSet().add(new XSet());
  for (const aValue of a) {
for (const set of new XSet(powerSet)) {
      powerSet.add(new XSet(set).add(aValue));
} }
  return powerSet;
}
}
 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值