JavaScript數據結構02之集合

集合是一組無序但彼此之間又有必定相關性的成員構成的,每一個成員在集合中只能出現一次。javascript

- 不包含任何成員的空集,全集則是包含一切的成員的集合。
- 若是兩個集合的成員徹底相同,則稱爲兩個集合相等
- 若是一個集合中全部的成員都屬於另一個集合則稱前一集和爲另外一集合的子集複製代碼

集合操做

  • 並集
    將兩個集合的成員進行合併,獲得一個新的集合。
  • 交集
    兩個集合中共同的成員組成新的集合。
  • 補集
    屬於一個集合但不屬於另外一個集合的成員組成的集合。

JS實現

資源參考與完善:https://github.com/dobbin/javascriptjava

/** * 集合類JavaScript描述 * @constructor */
function Set() {

    this.dataStore = [];

    this.add = add;

    this.remove = remove;

    this.size = size;

    this.union = union;

    this.intersect = intersect;

    this.subset = subset;

    this.difference = difference;

    this.show = show;

    this.has = has;

}
/** * 添加元素 * @param data * @returns {boolean} */
function add(data) {
    if (this.dataStore.indexOf(data) < 0) {
        this.dataStore.push(data);
        return true;
    } else {
        return false;
    }
}
/** * 移除數據 * @param data * @returns {boolean} */
function remove(data) {
    var index = this.dataStore.indexOf(data);
    if (index > -1) {
        this.dataStore.splice(index,1);
        return true;
    } else {
        return false;
    }
}
/** * 獲取集合全部數據 * @returns {Array} */
function show() {
    return this.dataStore;
}
/** * 檢測是否含有某元素 * @param data * @returns {boolean} */
function has(data) {
    return this.dataStore.indexOf(data) >= 0;
}
/** * 獲取元素的長度 * @returns {Number} */
function size() {
    return this.dataStore.length;
}

/** * 並集 * @param set * @returns {Set} */
function union(set) {
    var tempSet = new Set();
    var i = 0,
        l = this.dataStore.length;
    for (; i < l; i++) {
        tempSet.add(this.dataStore[i]);
    }

    var j = 0,
        ol = set.dataStore.length;
    for ( ; j < ol; j++) {
        if (!(tempSet.has(set.dataStore[j]))) {
            tempSet.dataStore.push(set.dataStore[j]);
        }
    }

    return tempSet;
}
//當一個元素屬於一個集合,同時也屬於另外一個集合時,則把該元素加入到一個新集合。
/** * 交集 * @param set * @returns {Set} */
function intersect(set) {
    var tempSet = new Set();
    var i = 0,
        l = this.dataStore.length;
    for (; i < l; i++) {
        if (set.has(this.dataStore[i])) {
            tempSet.add(this.dataStore[i]);
        }
    }
    return tempSet;
}
// 首先判斷這個集合的長度是否大於待比較的集合,若是大於則不多是他的子集,進而判斷該集合的元素是否有不存在待比較的集合中,若是有則說明不是他的子集。
/** * 子集 * @param set * @returns {Set} */
function subset(set) {
    if(this.size() > set.size()) {
        return false;
    }
    var i = 0,
        l = this.dataStore.length;
    for (; i < l; i++) {
        if (!set.has(this.dataStore[i])) {
            return false
        }
    }
    return true;
}

/** * 補集 * @param set * @returns {Set} */
function difference(set) {
    var tempSet = new Set();
    var i = 0,
        l = this.dataStore.length;
    for (; i < l; i++) {
        if (!(set.has(this.dataStore[i]))) {
            tempSet.add(this.dataStore[i]);
        }
    }
    return tempSet;
}

var a = new Set();
a.add("a");
a.add("b");
var b = new Set();
b.add("b");
b.add("c");
console.log(a.union(b).show());
console.log(a.difference(b).show());
console.log(a.intersect(b).show());複製代碼
相關文章
相關標籤/搜索