JavaScript數據結構-集合

来源:https://www.cnblogs.com/alongup/archive/2020/05/11/12872519.html
-Advertisement-
Play Games

介紹 集合是由一組無序且唯一(即不能重覆)的項組成的。比如由一個大於等於0的整數組成的集合:N={0,1,2,3,4,5,6,...}。 還有一個概念叫空集。用'{}'表示。 創建集合 我們使用對象來表示集合。 1 function Set() { 2 let items = {}; 3 } 常見方 ...


介紹

  集合是由一組無序且唯一(即不能重覆)的項組成的。比如由一個大於等於0的整數組成的集合:N={0,1,2,3,4,5,6,...}。

還有一個概念叫空集。用'{}'表示。

創建集合

我們使用對象來表示集合。

1 function Set() { 
2     let items = {}; 
3 }

常見方法

add(value):向集合添加一個新的項。
delete(value):從集合移除一個值。
has(value):如果值在集合中,返回true,否則返回false。  clear():移除集合中的所有項。
size():返回集合所包含元素的數量。與數組的length屬性類似。
values():返回一個包含集合中所有值的數組。

has方法

1 this.has = function(value){ 
2     return value in items; 
3 };
4 
5 ----------------或者-----------------
6 
7 this.has = function(value){ 
8  return items.hasOwnProperty(value); 
9 };

add方法

1 this.add = function (value) {
2     if (!this.has(value)) {
3         items[value] = value; 
4         return true;
5     }
6     return false;
7 };

remove方法

 1 this.remove = function (value) {
 2     if (this.has(value)) {
 3         delete items[value];
 4         return true;
 5     }
 6     return false;
 7 };
 8 
 9 this.clear = function(){ 
10     items = {};
11 };

size方法

1 this.size = function(){ 
2     return Object.keys(items).length;
3 };

values方法

values方法也應用了相同的邏輯,提取items對象的所有屬性,以數組的形式返回

1 this.values = function () {
2     let values = [];
3     for (let i = 0, keys = Object.keys(items); i < keys.length; i++) {
4         values.push(items[keys[i]]);
5     }
6     return values;
7 };

使用set類

 1 let set = new Set(); 
 2 set.add(1); 
 3 console.log(set.values()); //輸出["1"] 
 4 console.log(set.has(1)); //輸出true 
 5 console.log(set.size()); //輸出1 
 6 set.add(2); 
 7 console.log(set.values()); //輸出["1", "2"] 
 8 console.log(set.has(2)); //true 
 9 console.log(set.size()); //2 
10 set.remove(1); 
11 console.log(set.values()); //輸出["2"] 
12 set.remove(2); 
13 console.log(set.values()); //輸出[]

集合的一些操作

高中數學課本里也有。

並集:對於給定的兩個集合,返回一個包含兩個集合中所有元素的新集合。
交集:對於給定的兩個集合,返回一個包含兩個集合中共有元素的新集合。
差集:對於給定的兩個集合,返回一個包含所有存在於第一個集合且不存在於第二個集合的元素的新集合。
子集:驗證一個給定集合是否是另一集合的子集。

並集

並集的數學概念是集合A和集合B的並集,表示為:AB,集合定義如下:

AB = { x | x Ax B }

 

代碼實現Set類的union方法

 1 this.union = function (otherSet) {
 2     let unionSet = new Set(); //定義兩個集合的並集 
 3     let values = this.values();
 4     for (let i = 0; i < values.length; i++) { //獲取第一個集合的集都添加到並集中
 5         unionSet.add(values[i]);
 6     }
 7     values = otherSet.values(); 
 8     for (let i = 0; i < values.length; i++) { //獲取第二個集合的集都添加到並集中
 9         unionSet.add(values[i]);
10     }
11     return unionSet;
12 };

測試代碼

 1 let setA = new Set(); 
 2 setA.add(1); 
 3 setA.add(2); 
 4 setA.add(3); 
 5 let setB = new Set(); 
 6 setB.add(3); 
 7 setB.add(4); 
 8 setB.add(5); 
 9 setB.add(6); 
10 let unionAB = setA.union(setB); 
11 console.log(unionAB.values());
12 
13 //結果
14 ["1", "2", "3", "4", "5", "6"]

交集

交集的數學概念是集合A和集合B的交集,表示為:AB,集合的定義如下:

AB = { x | x Ax B }

           

 

代碼實現Set類的intersection方法

 1 this.intersection = function (otherSet) {
 2     let intersectionSet = new Set(); //創建交集返回共有的元素 
 3     let values = this.values();
 4     for (let i = 0; i < values.length; i++) { //便利當前Set類所有制
 5         if (otherSet.has(values[i])) { //驗證是否存在otherSet中
 6             intersectionSet.add(values[i]); //存在則添加
 7         }
 8     }
 9     return intersectionSet;
10 }

測試代碼

 1 let setA = new Set(); 
 2 setA.add(1); 
 3 setA.add(2); 
 4 setA.add(3); 
 5 let setB = new Set(); 
 6 setB.add(2); 
 7 setB.add(3); 
 8 setB.add(4); 
 9 let intersectionAB = setA.intersection(setB); 
10 console.log(intersectionAB.values());
11 
12 //結果
13 ["2", "3"] 

差集

差集的數學概念是集合A和集合B的差集,表示為:A-B,集合的定義如下:

A-B = { x | x A x B }

 

           

 

代碼實現Set類的difference方法

 1 this.difference = function (otherSet) {
 2     let differenceSet = new Set(); //創建差集的集合 
 3     let values = this.values();
 4     for (let i = 0; i < values.length; i++) { //遍歷當前Set類所有值
 5         if (!otherSet.has(values[i])) { //存在A但不存在與B的值
 6             differenceSet.add(values[i]); //添加到集合中
 7         }
 8     }
 9     return differenceSet;
10 };

測試代碼

 1 let setA = new Set(); 
 2 setA.add(1); 
 3 setA.add(2); 
 4 setA.add(3); 
 5 let setB = new Set(); 
 6 setB.add(2); 
 7 setB.add(3); 
 8 setB.add(4); 
 9 let differenceAB = setA.difference(setB); 
10 console.log(differenceAB.values());
11 
12 //結果
13 ["1"]

子集

子集的數學概念是集合A是集合B的子集,表示為:AB ,集合的定義如下:

x { x A x B }

 

           

 

代碼實現Set類的subset方法

 1 this.subset = function (otherSet) {
 2     if (this.size() > otherSet.size()) { //當前set類的大小必須要大於otherSet實例大小
 3         return false;
 4     } else {
 5         let values = this.values();
 6         for (let i = 0; i < values.length; i++) { //遍歷Set類所有元素
 7             if (!otherSet.has(values[i])) { //驗證元素是否頁都存在與otherSet中
 8                 return false; //有不存在的,為false
 9             }
10         }
11         return true; //都存在則為true
12     }
13 };

測試代碼

 1 let setA = new Set(); 
 2 setA.add(1);
 3 setA.add(2); 
 4 let setB = new Set(); 
 5 setB.add(1); 
 6 setB.add(2); 
 7 setB.add(3); 
 8 let setC = new Set(); 
 9 setC.add(2); 
10 setC.add(3); 
11 setC.add(4); 
12 console.log(setA.subset(setB)); 
13 console.log(setA.subset(setC));
14 
15 //結果
16 setA是setB的子集(因此輸出為true),然而setA不是setC的子集(setC只包含了setA中的2,而不包含1),因此輸出為false。

 

 來源:JavaScript數據結構與演算法

 總結:along

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 理解和掌握Redis的持久機制,對於Redis的日常開發和運維都有很大幫助,也是在大廠面試經常被問到的知識點。 ...
  • Netflix(Nasdaq NFLX),也就是網飛公司,成立於1997年,是一家線上影片[租賃]提供商,主要提供Netflix超大數量的[DVD]並免費遞送,總部位於美國加利福尼亞州洛斯蓋圖。1999年開始訂閱服務。2009年,該公司可提供多達10萬部DVD電影,並有1千萬的訂戶。2007年2月2 ...
  • 文本的一些屬性 android:id="@+id/editText" 給文本的id重命名 android:layout_width="wrap_content" 必要的長寬 android:layout_height="wrap_content" android:ems="10" 本文本框一行的最大 ...
  • 本項目目的是在移動端的 Native App 中以庫的形式集成已經寫好的 Unity 工程,利用 Unity 游戲引擎便捷的開發手段進行跨平臺開發。 ...
  • 更多的文章請看-2020iOS面試大全 持續更新! 分類 擴展 代理(Delegate) 通知(NSNotification) KVO (Key-value observing) KVC (Key-value coding) 屬性關鍵字 一、分類 1.分類的作用? 聲明私有方法,分解體積大的類文件, ...
  • 新聞 1. "喪心病狂or形勢所迫?談談Android奇葩的“鏈式啟動”" 1. "傳聞稱Android TV將更名為Google TV" 1. "谷歌官宣Android 11 Beta發佈會:6月3日見" 教程 1. "協程 Flow 最佳實踐 | 基於 Android 開發者峰會應用" 1. " ...
  • 學習 babel 時,遇到的問題,使用舊版本 babel 命名規則安裝後運行報錯,初步查找到原因是因為 babel 各個preset和plugin新舊不同版本之間存在相容問題,提示使用 npx babel-upgrade 可以自動升級,但是我升級失敗了,提示解析錯誤,後來看到了這篇文章,問題得以解決 ...
  • 一、逗號表達式 1.程式中使用逗號表達式,通產是要分別求出逗號表示式內各表達式的值,並不一定要求整個表達式的值。 2.並不是所有出現逗號的地方都組成逗號表達式,例如在變數說明中,函數參數表中逗號,只是用作各個變數之間的間隔符。 var a,b; b = (a=3,--a,a*5); console. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...