重学JavaScript数据结构之 “集合”

58 阅读2分钟

1.什么是集合

集合是由一组无序且唯一的项组成的。你也可以把几个想象成一个既没有重复元素,也没有顺序概念的数组。

2.集合的方法

首先我们创建一个类来表示栈:

class mySet {
    constructor() {
        this.items = {};
    }
}

上述代码中我们通过对象表示集合,接下来还需要声明一些集合里面可用的方法:

add(item): 向集合中添加一个新元素。
delete(item): 删除集合中对应的元素。
has(item): 判断集合中是否已存在目标元素,若存在返回true,反之返回falsevalues(): 返回一个包含集合中所有元素的数组。
clear(): 移除集合内的所有元素。
size(): 返回集合内元素的数量。

现在我们可以这样表示集合:

class myStack {
    constructor() {
        this.items = {};
    }
    add(item) {}
    delete(item) {}
    has(item) {}
    values() {}
    clear() {}
    size() {}
}

3.集合的实现

has方法,这里我们采用ObjecthasOwnProperty方法判断:

has(item) {
    return Object.prototype.hasOwnProperty.call(this.items, item);
}

add方法,插入成功返回true,插入失败返回false

add(item) {
    if (!this.has(item)) {
        this.items[item] = item;
        return true;
    }
    return false;
}

delete方法,删除成功返回true,删除失败返回false

delete(item) {
    if (this.has(item)) {
        delete this.items[item];
        return true;
    }
    return false;
}

clear方法:

clear() {
    this.items = {};
}

size方法,通过Object.keys()方法获取元素个数:

size() {
    // let count = 0;
    // for...in 会遍历原型链上的属性
    // for (item in this.items) {
    //    if (this.has(item)) {
    //        count++;
    //     }
    // }
    // return count;
    return Object.keys(this.items).length;
}

values方法:

values() {
    return Object.keys(this.items);
}

综上,集合完整代码如下:

class myStack {
    constructor() {
        this.items = {};
    }
    add(item) {
        if (!this.has(item)) {
            this.items[item] = item;
            return true;
        }
        return false;
    }
    delete(item) {
        if (this.has(item)) {
            delete this.items[item];
            return true;
        }
        return false;
    }
    has(item) {
        return Object.prototype.hasOwnProperty.call(this.items, item);
    }
    values() {
        return Object.keys(this.items);
    }
    clear() {
        this.items = {};
    }
    size() {
        // let count = 0;
        // for...in 会遍历原型链上的属性
        // for (item in this.items) {
        //    if (this.has(item)) {
        //        count++;
        //     }
        // }
        // return count;
        return Object.keys(this.items).length;
    }
}

4.集合的运用

4.1 交集

insterserction(otherSet) {
    const newSet = new mySet();
    this.values().forEach(value => {
        if (otherSet.has(value)) {
            newSet.add(value);
        }
    })
    return newSet;
}

4.2 并集

union(otherSet) {
    const newSet = new mySet();
    this.values().forEach(value => {
        newSet.add(value);
    })
    otherSet.forEach(value => {
        newSet.add(value);
    })
    return newSet;
}

4.3 差集

difference(otherSet) {
    const newSet = new mySet();
    this.values().forEach(value => {
        if (!otherSet.has(value)) {
            newSet.add(value);
        }
    })
    return newSet;
}

4.4 子集

isSubsetOf(otherSet) {
    if (this.size() > otherSet.size()) {
        return false;
    }
    let isSubset = true;
    this.values().forEach(value => {
        if (!otherSet.has(value)) {
            isSubset = false;
        }
    })
    return isSubset;
}