集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重 要特性是:
1、集合中的成员是无序的
2、集合中不允许相同成员存在
1 集合的定义、操作和属性
1.1 集合的定义
- 不包含任何成员的集合称为空集,全集则是包含一切可能成员的集合。
- 如果两个集合的成员完全相同,则称两个集合相等。
- 如果一个集合中所有的成员都属于另外一个集合,则前一集合称为后一集合的子集。
1.2 对集合的操作
• 并集
将两个集合中的成员进行合并,得到一个新集合。
• 交集
两个集合中共同存在的成员组成一个新的集合。
• 补集
属于一个集合而不属于另一个集合的成员组成的集合。
2 Set类的实现
function Set() {
this.dataStore = [];
this.add = add;
this.remove = remove;
this.size = size;
this.union = union;
this.intersect = intersect;
this.subset = subset;
this.difference = difference;
this.contains = contains;
this.show = show;
}
// 添加数据 确保数据不重复 使用indexOf检查数据, 返回true 和false 得到插入的状态
function add(data) {
if (this.dataStore.indexOf(data) < 0) {
this.dataStore.push(data)
return true;
} else {
return false;
}
}
// 删除数据 工作原理类似 查找是否有数据 有 splice 移除
function remove(data) {
let pos = this.dataStore.indexOf(data);
if (pos > -1) {
this.dataStore.splice(pos, 1);
return true
} else {
return false;
}
}
//在定义 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.dataStore.push(set.dataStore[i]);
}
}
return tempSet;
}
// 求两个集合的交集
//每当发现第一 个集合的成员也属于第二个集合时,便将该成员加入一个新集合,这个新集合即为方法的 返回值。
function intersect(set) {
var tempSert = new Set()
for (var i = 0; i < this.dataStore.length; ++i) {
if (set.contains(this.dataStore[i])) {
tempSert.add(this.dataStore[i])
}
}
return tempSert;
}
//subset() 方法首先要确定该集合的长度是否小于待比较 集合。
//如果该集合比待比较集合还要大,那么该集合肯定不会是待比较集合的一个子集。
//当该集合的长度小于待比较集合时,再判断该集合内的成员是否都属于待比较集合。
//如果 有任意一个成员不属于待比较集合,则返回 false,程序终止。
//如果一直比较完该集合的 最后一个元素,所有元素都属于待比较集合,那么该集合就是待比较集合的一个子集,该 方法返回 true。
function size() {
return this.dataStore.length;
}
function subset(set) {
let a;
if (this.size() > set.size) {
return false
} else {
for (let i = 0; i < this.dataStore.length; ++i) {
if (!set.contains(this.dataStore[i])) {
return false;
}
}
}
return true;
}
// difference(),该方法返回一个新集合 该集合包含的是那些属于第一个集合但不属于第二个集合的成员
function difference(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;
}
// 显示数据
function show() {
return this.dataStore
}
var cis = new Set();
var it = new Set();
cis.add("Clayton");
cis.add("Jennifer");
cis.add("Danny");
it.add("Bryan");
it.add("Clayton");
it.add("Jennifer");
var diff = new Set();
diff = cis.difference(it);
print("[" + cis.show() + "] difference [" + it.show()
+ "] -> [" + diff.show() + "]");