《七》集合
集合 Set 是由一组无序但彼此之间又有一定相关性的成员构成的,每个成员在集合中只能出现一次。
集合的两个最重要特性是:首先,集合中的成员是无序的;其次,集合中不允许相同成员存在。
在数学上,用大括号将一组成员括起来表示集合,比如:{0,1,2,3,4,5,6,7,8,9}。集合中成员的顺序是任意的,因此前面的集合也可以写成{9,0,8,1,7,2,6,3,5,4},或其他任意形式的组合,但是必须保证每个成员只能出现一次。
当想要创建一个数据结构,用来保存一些独一无二的元素时,集合就变得非常有用。
集合中的元素称为成员。
不包含任何成员的借称为空集;全集则是包含一切可能成员的集合。
如果两个集合的成员完全相同,则称两个集合相等。
如果一个结合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集。
对集合的基本操作有以下几种:
- 并集:将两个集合中的成员进行合并,得到一个新集合。
- 交集:两个集合*同存在的成员组成一个新的集合。
- 补集:属于一个集合而不属于另一个集合的成员组成的集合。
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() 方法首先要确定该集合的长度是否小于待比较集合,如果该集合长度比待比较集合还要大,那么该集合肯定不会是待比较集合的一个子集;当该集合的长度小于待比较集合时,再判断该集合内的成员是否都属于待比较集合,如果有任意一个成员不属于待比较集合
上一篇: 怎么获取json的key