欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《七》集合

程序员文章站 2022-03-05 12:56:42
...

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