您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

《七》集合

集合 Set 是由一组无序但彼此之间又有一定相关性的成员构成的,每个成员在集合中只能出现一次。

集合的两个最重要特性是:首先,集合中的成员是无序的;其次,集合中不允许相同成员存在。

在数学上,用大括号将一组成员括起来表示集合,比如:{0,1,2,3,4,5,6,7,8,9}。集合中成员的顺序是任意的,因此前面的集合也可以写成{9,0,8,1,7,2,6,3,5,4},或其他任意形式的组合,但是必须保证每个成员只能出现一次。

当想要创建一个数据结构,用来保存一些独一无二的元素时,集合就变得非常有用。

集合中的元素称为成员。
不包含任何成员的借称为空集;全集则是包含一切可能成员的集合。
如果两个集合的成员完全相同,则称两个集合相等。
如果一个结合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集。

对集合的基本操作有以下几种:

  1. 并集:将两个集合中的成员进行合并,得到一个新集合。
  2. 交集:两个集合中共同存在的成员组成一个新的集合。
  3. 补集:属于一个集合而不属于另一个集合的成员组成的集合。

Set 类的实现:

Set 类的实现基于数组,数组用来存储数据。

function Set(){
	this.datastore = []
	this.add = add
	this.remove = remove
	this.size = size
	this.contains = contains
	this.union = union
	this.intersect = intersect
	this.subset = subset
	this.difference = diffference
	this.show = show
}
add():添加成员

因为集合中不能包含相同的元素,所以,使用 add() 方法将数据存储到数组前,先要确保数组中不存在该数据。将 add() 方法的返回值定义为布尔类型,可以明确告诉我们是否将一个元素成功加入到了集合中。

function add(data){
	if(this.datastore.indexOf(data)<0){
		this.datastore.push(data)
		return true
	}else{
		return false
	}
}
remove():删除成员

首先检查待删除元素是否在数组中,如果在,则使用数组的 splice() 方法删除该元素并返回 true;否则,返回 false,表示集合中不存在这样一个元素。

function remove(data){
	var pos = this.datastore.indexOf(data)
	if(pos>-1){
		this.datastore.splice(pos,-1)
		return true
	}else{
		return false
	}
}
show():显示集合中的所有成员
function show(){
	return this.datastore
}
union():并集

union() 执行并集操作,将两个集合合并成一个。该方法首先将第一个集合里的成员悉数加入一个临时集合,然后检查第二个集合中的成员,看它们是否也属于第一个集合,如果属于,则跳过该成员;否则就将该成员加入临时集合。

在定义 union() 方法前,先需要定义一个辅助方法 contains(),该方法检查一个成员是否属于该集合。

function contains(data){
	if(this.datastore.indexOf(data)>-1){
		return true
	}else{
		return false
	}
}

现在可以开始定义 union() 方法了。

function union(set){
	var tempSet = new Set()
	for(var i=0;i<this.datastore.length;i++){
		tempSet.add(this.datastore[i])
	}
	for(var i=0;i<set.datastore.length;i++){
		if(!tempSet.contains(set.datastore[i])){
			tempSet.add(set.datastore[i])
		}
	}
	return tempSet
}
intersect():交集

每当发现第一个集合的成员也属于第二个集合时,便将该成员加入一个新集合,这个新集合即为方法的返回值。

function intersect(set){
	var tempSet = new Set()
	for(var i=0;i<this.datastore.length;i++){
		if(set.contains(this.datastore[i])){
			tempSet.add(this.datastore[i])
		}
	}
	return tempSet
}
subset():判断集合是否是另一个集合的子集

subset() 方法首先要确定该集合的长度是否小于待比较集合,如果该集合长度比待比较集合还要大,那么该集合肯定不会是待比较集合的一个子集;当该集合的长度小于待比较集合时,再判断该集合内的成员是否都属于待比较集合,如果有任意一个成员不属于待比较集合


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进