集合的实现 -- 数据结构与算法的javascript描述 第九章

集合

集合(set)是一种包含不同元素的数据结构。
集合中的元素称为成员。
集合的两个最重要特性是:首先,集合中的成员是无序的;其次,集合中不允许相同成员存在。

code

function Set(){
        var me = this;
        me.dataStore = [];
        me.add = add;
        me.remove =remove;
        me.size = size;
        me.union = union;
        me.intersect = intersect;
        me.subset = subset;
        me.difference = difference;
        me.show = show;
        me.contains = contains;

        function add(data){
            if(me.dataStore.indexOf(data)<0){
                me.dataStore.push(data)
                me.dataStore.sort();
                return true;
            }else{
                return false;
            }
        }
        function remove(data){
            var pos = me.dataStore.indexOf(data);
            if(pos>-1){
                me.dataStore.splice(pos,1)
                return true;
            }else{
                return false;
            }

        }

        /**
         * 合并集合
         * @param set
         */
        function union(set){
            var tempSet = new Set();
            for(var i=0;i<me.dataStore.length;i++){
                tempSet.add(me.dataStore[i])
            }
            for(var i=0;i<set.dataStore.length;i++){
                if(!tempSet.contains(set.dataStore[i])){
                    tempSet.add(set.dataStore[i])
                }
            }
            return tempSet;
        }

        /**
         * 寻找交集
         */
        function intersect(set){
            var tempSet = new Set();
            for(var i=0;i<me.dataStore.length;i++){
                if(set.contains(me.dataStore[i])){
                    tempSet.add(me.dataStore[i])
                }
            }
            return tempSet;
        }

        /**
         * 判断是否子集
         * @param set
         * @returns {boolean}
         */
        function subset(set){
            if(me.size()>set.size()) {
                return false;
            }else{
               for(var i in me.dataStore){
                   if(!(set.contains(me.dataStore[i]))){
                       return false;
                   }
               }

            }
            return true;

        }

        /**
         * 比较2集合不同 并返回
         * @param set
         * @returns {Set}
         */
        function difference(set){
            var tempSet = new Set();
            for(var i=0;i<me.dataStore.length;i++){
                if(!set.contains(me.dataStore[i])){
                    tempSet.add(me.dataStore[i])
                }
            }
            return tempSet;
        }

        /**
         * 获取该集合长度
         * @returns {Number}
         */
        function size(){
            return me.dataStore.length;
        }
        /**
         * 显示该集合
         * @returns {Array}
         */
        function show(){
            console.log(me.dataStore)
            return me.dataStore;
        }

        /**
         * 检查该成员是否属于该集合
         * @param data
         * @returns {boolean}
         */
        function contains(data){
            if(me.dataStore.indexOf(data)>-1){
                return true;
            }else{
                return false;
            }
        }
    }

tests

//集合测试
            var names = new Set();
            names.add("David");
            names.add("Jennifer");
            names.add("Cynthia");
            names.add("Mike");
            names.add("Raymond");
            //show 测试
            names.show();
            //remove测试
            names.remove("David")
            names.show()

//union 合并集合 测试
            var cis = new Set();
            cis.add("Mike");
            cis.add("Clayton");
            cis.add("Jennifer");
            cis.add("Raymond");
            var dmp = new Set();
            dmp.add("Raymond");
            dmp.add("Cynthia");
            dmp.add("Jonathan");

            var it = cis.union(dmp);
            it.show()

            //交集测试
            var inter = cis.intersect(dmp)
            inter.show();

            //判断是否子集
            var it2 = new Set();
            it2.add("Cynthia");
            it2.add("Clayton");
            it2.add("Jennifer");
            it2.add("Danny");
            it2.add("Jonathan");
            it2.add("Terrill");
            it2.add("Raymond");
            it2.add("Mike");
            var dmp2 = new Set();
            dmp2.add("Cynthia");
            dmp2.add("Raymond");
            dmp2.add("Jonathan");
            console.log("dmp2 是否是it2 子集:"+dmp2.subset(it2))

            //找不同

            var d = it2.difference(dmp2)
            d.show();
原文地址:https://www.cnblogs.com/iyueyao/p/4015023.html