集合(set)是一种包含不同元素的数据结构。集合中的元素称为成员。集合的两个最重要特性是:首先,集合中的成员是无序的;其次,集合中不允许相同成员存在。当你想要创建一个数据结构用来保存一些独一无二的元素时就可以用到集合。
基于数组的 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.show = show; this.contains = contains;}
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;}
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;}
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() 方法判断本集合是否是另一个集合的子集。首先要确定本集合的长度是否小于待比较集合,当该集合的长度小于待比较集合时,再判断该集合内的成员是否都属于待比较集合。
function subset(set) { if (this.size() > set.size()) { return false; } else { for(var member of this.dataStore) { if (!set.contains(member)) { return false; } } } return true;}
size() 方法返回集合的元素数量
function size() { return this.dataStore.length;}
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;}