/** * 返回两个集合的交集 * @param {Set} otherSet 要进行交集操作的集合 * @return {Set} 两个集合的交集 */ this.intersection = function(otherSet) { //初始化一个新集合,用于表示交集。 var interSectionSet = new Set(); //将当前集合转换为数组 var values = this.values(); //遍历数组,如果另外一个集合也有该元素,则interSectionSet加入该元素。 for (var i = 0; i < values.length; i++) { if (otherSet.has(values[i])) { interSectionSet.add(values[i]) } } return interSectionSet; };
difference方法
说明: 返回两个集合的差集
实现:
/** * 返回两个集合的差集 * @param {Set} otherSet 要进行差集操作的集合 * @return {Set} 两个集合的差集 */ this.difference = function(otherSet) { //初始化一个新集合,用于表示差集。 var differenceSet = new Set(); //将当前集合转换为数组 var values = this.values(); //遍历数组,如果另外一个集合没有该元素,则differenceSet加入该元素。 for (var i = 0; i < values.length; i++) { if (!otherSet.has(values[i])) { differenceSet.add(values[i]) } } return differenceSet; };
subset方法
说明: 判断该集合是否为传入集合的子集。这段代码在我自己写完后与书上一比对,觉得自己超级low。我写的要遍历数组三次,书上的只需要一次,算法复杂度远远低于我的。
实现:
/** * 判断该集合是否为传入集合的子集 * @param {Set} otherSet 传入的集合 * @return {Boolean} 是则返回True */ this.subset = function(otherSet) { // 第一个判定,如果该集合长度大于otherSet的长度 // 则直接返回false 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])) { // 第二个判定。只要有一个元素不在otherSet中 // 那么则可以直接判定不是子集,返回false return false; } } return true; } };
ES6中的集合
ES6也提供了集合,但之前看ES6的集合操作一直迷迷糊糊的。实现一遍后再去看,感觉概念清晰了很多。
具体的我掌握的不是很好,还在学习中,就不写出来啦~推荐看阮一峰老师的《ECMAScript 6入门》中对ES6 Set的介绍。
《ECMAScript 6入门》– Set和Map数据结构
感想
到了这儿,已经掌握了一些基本的数据结构。剩下的都是难啃的骨头了(对我而言)。
字典的散列表、图、树、排序算法。算是四大金刚,所以近期关于数据结构与算法系列的文章,可能会更新的很慢。对我来说,也算是一个坎。希望这个寒假,能跨过这个坎。
您可能感兴趣的文章: