zoukankan      html  css  js  c++  java
  • 【javascript】数据结构-集合

    <!DOCTYPE html>
    <html>
    <head>
    	<title>集合</title>
    	<meta charset="utf-8">
    	<script type="text/javascript">
    		function Set(){
    
    			let items = {};
    
    			// add:添加一个新的项
    			this.add = function(value){
    				if(!this.has(value)){
    					// 添加一个值的时候,把它同时作为键和值保存,有利于查找这个值
    					items[value] = value;
    					return true;
    				}
    				return false;
    			};
    
    			// delete:删除值
    			this.delete = function(value){
    				if(this.has(value)){
    					delete items[value];
    					return true;
    				}
    				return false;
    			};
    
    			// has:如果值在集合中返回true,否则返回false
    			this.has = function(value){
    				return items.hasOwnProperty(value);
    			};
    
    			// clear:移除集合中的所有项
    			this.clear = function(){
    				items = {};
    			};
    
    			// size:返回集合中所包含的元素数量,与数组的length属性类似
    			this.size = function(){
    				return Object.keys(items).length;
    			};
    
    			// sizeLegacy:跨浏览器兼容返回集合元素数量
    			this.sizeLegacy = function(){
    				let count = 0;
    				for(let key in items){
    					if(items.hasOwnPrototype(key)){
    						++count;
    					}
    				}
    				return count;
    			};
    
    			// values:返回一个包含集合中所有数据的数组
    			this.values = function(){
    				let values = [];
    				for(let i=0, keys = Object.keys(items); i<keys.length; i++){
    					values.push(items[keys[i]]);
    				}
    				return values;
    			};
    
    			// valuesLegacy:跨浏览器兼容
    			this.valuesLegacy = function(){
    				let values = [];
    				for(let key in items){
    					if(items.hasOwnPrototype(key)){
    						values.push(items[key]);
    					}
    				}
    				return values;
    			};
    
    			// getItems
    			this.getItems = function(){
    				return items;
    			};
    
    			// union:并集
    			this.union = function(otherSet){
    				let unionSet = new Set();
    
    				let values = this.values();
    				for(let i=0; i<values.length; i++){
    					unionSet.add(values[i]);
    				}
    
    				values = otherSet.values();
    				for(let i=0; i<values.length; i++){
    					unionSet.add(values[i]);
    				}
    				return unionSet;
    			};
    
    			// intersection:交集
    			this.intersection = function(otherSet){
    				let intersectionSet = new Set();
    
    				let values = this.values();
    				for(let i=0; i<values.length; i++){
    					if(otherSet.has(values[i])){
    						intersectionSet.add(values[i]);
    					}
    				}
    				return intersectionSet;
    			};
    
    			//difference:差集
    			this.difference = function(otherSet){
    				let differenceSet = new Set();
    				let values = this.values();
    				for(let i=0; i<values.length; i++){
    					if(!otherSet.has(values[i])){
    						differenceSet.add(values[i]);
    					}
    				}
    				return differenceSet;
    			};
    
    			// subset:子集
    			this.subset = function(otherSet){
    				if(this.size() > otherSet.size()){
    					return false;
    				}
    				else{
    					let values = this.values();
    					for(let i=0; i<values.length; i++){
    						if(!otherSet.has(values[i])){
    							return false;
    						}
    					}
    				}
    				return true;
    			}
    
    		}
    
    		// Set的使用
    		var set1 = new Set();
    		set1.add(1);
    		set1.add(2);
    		set1.add(3);
    
    		var set2 = new Set();
    		set2.add(1);
    		set2.add(2);
    		set2.add(3);
    		set2.add(4);
    		set2.add(5);
    
    		var set3 = new Set();
    		set3.add("a");
    		set3.add("b");
    		set3.add("c");
    		set3.add("d");
    
    		// 打印集合大小
    		console.log(set1.size());				//3
    		console.log(set2.size());				//5
    		console.log(set3.size());				//4
    
    		//打印集合元素的数组形式
    		console.log(set1.values());				//[1,2,3]
    		console.log(set2.values());				//[1,2,3,4,5]
    		console.log(set3.values());				//["a", "b", "c", "d"]
    
    		 // 求set1和set2的并集
    		 let set12 = set1.union(set2);
    		 console.log(set12.values());			//[1,2,3,4,5]
    		 
    		 // 求set1和set2的交集
    		 let _set12  = set1.intersection(set2);
    		 console.log(_set12.values());			//[1,2,3]
    
    		 // 求set1和set2的差集
    		 let set2_1 = set2.difference(set1);
    		 console.log(set2_1.values());			//[4,5]
    		 
    		 // 判断set1是否为set2的子集
    		 console.log(set1.subset(set2));		//true
    
    		 // 判断set3是否为set2的子集
    		 console.log(set3.subset(set2));		//false
    	</script>
    </head>
    <body>
    
    </body>
    </html>
    

      

  • 相关阅读:
    数据结构与算法
    c++学习笔记
    红黑树(map与unorder_map)B B+树
    数据库笔记
    多路复用IO:select poll epoll
    https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
    助教周报(第一轮)——范青青
    第二十二周助教总结(2021.6.28-7.4)
    第二十一周助教总结(2021.6.21-6.27)
    第二十周助教总结(2021.6.14-6.20)
  • 原文地址:https://www.cnblogs.com/dragonir/p/7710762.html
Copyright © 2011-2022 走看看