簡單說一說數據結構——集合

迄今爲止,我們已經學習了數組(列表)、棧、隊列和鏈表(及其變種)等順序數據結構。

這一節我們講講集合。集合的定義是由一組無序且唯一(即不能重複)的項組成的。不包含任何元素的集合就叫做空集。上高中那會,我們都接觸過集合,其中一些概念比如交集、並集、差集等等。

ECMAScript6也實現了集合這種數據結構——Set類。而我們用ECMAScript5來實現。也可以爲看Set時做鋪墊。

首先,集合Set類的骨架是

function Set(){
    var items = {}; 
}

與之前不同的是,這裏使用的是對象而不是數組來表示集合。因爲對象和集合有一個共同點,Javascript不允許一個鍵指向兩個不同的屬性,也保證了集合裏的元素都是唯一的。

集合Set類中有一些可用的方法:
add(value):向集合添加一個新的項。
remove(value):從集合中移除一個值。
has(value):判斷集合中是否存在某個值。
clear():移除集合中所有的項。
size():返回集合中所包含元素的數量。
values():返回一個包含集合中所有值的數組。

實現起來藉助對象也是非常easy的:

    this.has = function(value){
        return items.hadOwnProperty(value);     //return value in items;
    };
    this.add = function(value){
        if(!this.has(value)){
            items[value] = value;
            return true;
        }
        return false;
    };
    this.remove = function(value){
        if(this.has(value)){
            delete items[value];
            return true;
        }
        return false;
    };
    this.clear = function(){
        items = {};
    };
    // this.size = function(){
    //  return Object.keys(items).length;
    // };
    this.sizeLegacy = function(){
        var count = 0;
        for(var prop in items){
            if(items.hadOwnProperty(prop)){
                count++;
            }
        }
        return count;
    };
    // this.values = function(){
    //  return Object.keys(items);
    // }
    this.valuesLegacy = function(){
        var keys = [];
        for(var key in items){
            if(items.hadOwnProperty(key)){
                keys.push(key);
            }
        }
        return keys;
    };

以上代碼值得注意的點有:在has方法中,hasOwnProperty函數會返回對象是否有某個特定屬性。有就返回true,沒有就返回false。其次在size方法中,提供了兩種方式。第一種方式是利用keys函數,它返回一個包含給定對象所有屬性的數組。支持該方法的瀏覽器有IE9+、Firefox4+、Chrome5+、Opera12+和Safari5+。要使size方法適用所有瀏覽器,那麼就使用sizeLegacy函數。values函數同理。

瞭解完集合的基本概念和操作。下面講一講集合之間的關係及操作:
並集:對於給定的兩個集合,返回一個包含兩個集合中所有元素的新集合。
交集:對於給定的兩個集合,返回一個包含兩個集合中共有元素的新集合。
差集:對於給定的兩個集合,返回一個包含所有存在於第一個集合且不存在於第二個集合的元素的新集合。
子集:驗證一個給定集合是否是另一個集合的子集。

並集用一張圖表示:
並集

    this.union = function(otherSet){
        var unionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            unionSet.add(values[i]);
        }

        for(var i = 0 ; i < otherSet.length ; i++){
            unionSet.add(otherSet[i]);
        }

        return unionSet;
    };

交集用一張圖表示:
交集

this.intersection = function(){
        var intersectionSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(otherSet.has(values[i])){
                intersectionSet.add(values[i]);
            }
        }
        return intersectionSet;
    };

差集用一張圖表示
差集

this.difference = function(otherSet){
        var differenceSet = new Set();

        var values = this.values();
        for(var i = 0 ; i < values.length ; i++){
            if(!otherSet.has(values[i])){
                differenceSet.add(values[i]);
            }
        }
        return differenceSet;
    };

最後一個子集:
子集

this.subset = function(otherSet){
        if(this.size() > otherSet.size()){
            return false;
        }else{
            var values = this.values();
            for(var u = 0 ; i < values.length ; i++){
                if(!otherSet.has(values[i])){
                    return false;
                }
            }
            return true;
        }
    };

集合講到這裏也就完了,還是比較簡單的一種結構。含測試代碼

發佈了33 篇原創文章 · 獲贊 19 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章