集合是由一組無序且唯一的項組成的。這個資料結構使用了與有限集合相同的數學概念,但應用在電腦科學的資料結構中。在數學中,集合也有並集、交集、差集等基本操作。
集合的基本性質有一條: 集合中元素是不重複的。因為這種性質,所以我們選用了物件來作為集合的容器,而非陣列。
簡單實現集合類
下面我們先來簡單實現一個集合類,幷包含以下的方法:
- has(value): 檢測集合內是否有某個元素
- add(value): 給集合內新增某個元素
- remove(value): 移除集合中某個元素
- clear(value): 清空集合
- size(): 返回集合長度
- values(): 返回集合轉換的陣列
程式碼如下:
function Set() {
var items = {};
/**
* 檢測集合內是否存在某個元素
*
* @param {any} value 檢測的元素
* @returns 存在則返回true
*/
this.has = function (value) {
return items.hasOwnProperty(value);
}
/**
* 給集合新增某個元素
*
* @param {any} value 要新增的元素
* @returns 新增成功返回true
*/
this.add = function (value) {
if (this.has(value)) {
// 如果集合中已存在該元素
return false;
}
items[value] = value;
return true;
}
/**
* 移除集合中的某個元素
*
* @param {any} value 要移除的元素
* @returns 移除成功返回true
*/
this.remove = function (value) {
if (!this.has(value)) {
// 如果集合中不存在該元素
return false;
}
delete items[value];
return true;
}
/**
* 清空集合
*/
this.clear = function () {
items = {};
}
/**
* 返回集合長度
*/
this.size = function () {
return Object.keys(size).length
}
/**
* 返回集合轉換成的陣列
* @returns {Array} 轉換後的陣列
*/
this.values = function () {
var arr = [];
for (var key in items) {
var item = items[key];
arr.push(item)
}
return arr;
}
}
為集合類新增交、並、差集方法
在以上程式碼基礎上進行新增
交集方法
/**
* 返回兩個集合的交集
* @param {any} otherSet 要進行交集操作的集合
* @returns 兩個集合的交集
*/
this.intersection = function (otherSet) {
// 初始化一個新集合,用於表交集
var interSectionSet = new Set();
// 把當前集合轉換成陣列
var values = this.values();
// 遍歷陣列,如果另外一個集合也有該元素,則interSectionSet加入該元素。
for (var i = 0; i < values.length; i++) {
if (otherSet.has(values[i])) {
interSectionSet.add(values[i]);
}
}
return interSectionSet;
}
並集方法
/**
* 返回兩個集合的並集
* @param {any} otherSet 要進行並集操作的集合
* @returns 兩個集合的並集
*/
this.union = function (otherSet) {
// 初始化一個新集合,用於表示並集
var unionSet = new Set();
// 把當前集合依次新增進unionSet
var values = this.values();
for (var i = 0; i < values.length; i++) {
unionSet.add(values[i]);
}
// 將其他集合轉換成陣列,依次加添進unionSet
values = otherSet.values();
for (var i = 0; i < values.length; i++) {
unionSet.add(values[i]);
}
return unionSet
}
差集方法
/**
* 返回兩個集合的差集
*
* @param {any} otherSet 要進行差集操作的集合
* @returns 兩個集合的差集
*/
this.difference = function (otherSet) {
var differenceSet = new Set();
var values = this.values();
// 遍歷陣列,如果另外一個集合不存在該元素,則differenceSet加入該元素。
for (var i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
differenceSet.add(values[i]);
}
}
return differenceSet;
}
子集方法
/**
* 判斷該集合是否為傳入集合的子集
* @param {any} otherSet 傳入的集合
* @returns 如果為子集則返回true
*/
this.subset = function (otherSet) {
// 如果該集合長度大於傳入集合的長度,直接返回false,表示不是子集
if (this.size() > otherSet.size()) {
return false
}
var values = this.values();
// 遍歷陣列, 只要該集合中存在一個傳入集合沒有的元素,則返回false,表示不是子集
for (var i = 0; i < values.length; i++) {
if (!otherSet.has(values[i])) {
return false;
}
}
return true;
}