Go資料結構:集合

分析和實現Go語言中的集合資料結構 集合是一組值的集合。您可以對這些值進行迭代,添加新值,刪除值並清除集合,獲取集合大小,以及檢查集合是否包含某個項目。集合中的值可能只會被存儲一次,不允許重複。 第一個實現 這是一個簡單的集合實現,尚未具備並發安全性,為了簡潔和易於理解,並沒有鎖定資源。稍後在本文中將添加鎖定。 請注意第二行,它允許我們通過生成此通用資料結構的特定實現來使用任何類型的集合。 set.go // 包set為Item類型創建ItemSet資料結構 package set import "github.com/cheekybits/genny/generic" // Item 集合的類型 type Item generic.Type // ItemSet 集合項目的集合 type ItemSet struct { items map[Item]bool } // Add 向集合中添加新元素。返回集合的指針。 func (s *ItemSet) Add(t Item) *ItemSet { if s.items == nil { s.items = make(map[Item]bool) } _, ok := s.items[t] if !ok { s.items[t] = true } return s } // Clear 從集合中刪除所有元素 func (s *ItemSet) Clear() { s.items = make(map[Item]bool) } // Delete 從集合中刪除項目並返回有無(項目) func (s *ItemSet) Delete(item Item) bool { _, ok := s....

JavaScript 地圖資料結構

在 JavaScript 中,使用地圖資料結構可以將資料與鍵值關聯起來。在 ES6 引入地圖資料結構之前,人們通常將物件用作地圖,將某個物件或值與特定的鍵值關聯起來。 什麼是地圖 ES6 之前 進入地圖 將項目添加到地圖中 按鍵從地圖中獲取項目 按鍵從地圖中刪除項目 從地圖中刪除所有項目 檢查地圖中是否包含特定鍵的項目 查找地圖中項目的數量 初始化具有值的地圖 地圖的鍵 你幾乎永遠不會在真實生活中遇到的奇怪情況 遍歷地圖 遍歷地圖的鍵 遍歷地圖的值 遍歷地圖的鍵和值對 轉換為陣列 將地圖的鍵轉換為陣列 將地圖的值轉換為陣列 WeakMap 什麼是地圖 地圖資料結構允許將資料與鍵值關聯起來。 ES6 之前 ECMAScript 6(也稱為 ES2015)引入了地圖資料結構到 JavaScript 世界中,以及集合。 在 ES6 之前,人們通常使用物件作為地圖,通過將某個物件或值與特定的鍵值關聯起來: const car = {} car['color'] = 'red' car.owner = 'Flavio' console.log(car['color']) // red console.log(car.color) // red console.log(car.owner) // Flavio console.log(car['owner']) // Flavio 進入地圖 ES6 引入了地圖資料結構,為我們提供了一個適當的工具來處理這種類型的資料組織。 可以通過調用以下方法來初始化地圖: const m = new Map() 將項目添加到地圖中 可以使用 set 方法將項目添加到地圖中:...

JavaScript數組資料結構

數組是任何編程語言中最基本的資料結構。 數組在大多數(如果不是所有)編程語言中都是內建的。 讓我們來談談數組在大多數低級編程語言(如C語言)中的表示方式:它們表示計算機內存中一組連續的存儲單元。 從一個內存單元開始(如果你想的話,可以將這些單元想象成電子表格中的單元格),我們可以通過使用10個連續的存儲單元來創建一個包含10個插槽的數組。 這使我們能夠進行諸如通過知道第一個插槽(# 0)的內存地址,然後簡單地將 2 添加到該地址來訪問插槽#2之類的操作。 在JavaScript中,我們在更高層次上進行工作,數組的工作方式也不同。我們無法像C或其他低級語言那樣直接訪問內存,因此我們無法進行這種類型的數組數學運算。 低級語言中的數組只能存儲一種特定的數據類型,因此我們可以預先計算出數組將占用多少內存,以便將其安全地存儲在可以容納它的計算機內存中。 在JavaScript中,數組可以存儲任何類型的數據,並且可以混合使用。我們可以有一個數字,然後是一個物件,然後是另一個數組。 使用以下語法初始化數組: const myArray = [] 或者 const myArray = new Array() 這兩者沒有區別,但我更喜歡使用簡寫語法[]。 在JavaScript中,我們不需要在創建時指定數組大小,但是我們可以這樣做: const myArray = new Array(10) 然後我們可以填充數組的值: let val = 1 for (const [i, v] of myArray.entries()) { myArray[i] = val++ } 您可以使用以下語法引用數組中的第一個項目: myArray[0] (索引從0開始),並且可以通過增加索引號獲取數組中的每個後續項目: myArray[4] //5 myArray[3 + 4] //8 您可以使用以下語法更改任何位置的項目值: myArray[3] = 'Another item' JavaScript中的數組在內部是對象,因此它們具有方法。您可以使用 push方法將一個項目添加到數組的末尾: myArray.push(11) 您可以使用splice()方法(不要與slice()混淆)在任何位置添加項目。 在開頭: myArray.splice(0, 0, 'new item') 在索引3處: myArray.splice(3, 0, 'new item') 您可以使用以下語法從數組的末尾刪除一個項目:...

JavaScript的堆疊資料結構

堆疊是一種資料結構,相較於陣列具有更多限制。 我們只能將項目加入堆疊頂部,並且只能移除堆疊頂部的項目。 想像一下一堆書。你只能從頂部添加書,並且只能從頂部移除書。 因此,如果你添加了一堆書,然後想要存取第一本添加的書,你需要先移除所有書,直到到達第一本書。 這個概念被稱為「先進後出」(First In, Last Out,FILO)。 雖然JavaScript的陣列是內建的,不需要自己建立,但我們必須自己實現堆疊。 我們將創建一個封裝我們資料的資料結構,使其無法從外部訪問,只允許使用push()方法將資料添加到堆疊中,並使用pop()方法從堆疊中移除資料。 我們可以用多種不同的方式實現這一點。其中一種方式是使用類別,尤其是我要使用私有類別欄位。私有類別欄位尚不是JavaScript標準的一部分,但自版本12起在Chrome、Edge、Safari和Node.js中可用。但在Firefox中尚不可用,希望能夠早日支援。 為什麼我使用它們?因為它們使我們能夠非常容易地封裝類別的內部狀態並保護它免受外界的訪問。 class Stack { #items = [] push = (element) => this.#items.push(element) pop = () => this.#items.pop() isempty = () => this.#items.length === 0 empty = () => (this.#items.length = 0) size = () => this.#items.length } 我們有5個公共方法:push和pop用於將項目添加/移除堆疊,isempty用於檢查堆疊是否為空,empty用於清空堆疊,size用於獲取堆疊的大小。 現在,我們可以從這個類別建立堆疊物件並進行操作: const stack = new Stack() stack.push(1) stack.push(2) stack.push(3) console.log(stack.size()) //3 console.log(stack.pop()) //[ 3 ] console.log(stack.size()) //2 如果使用公共屬性,一切都會以相同的方式運作: class Stack { items = [] push = (element) => this....

Python列表

列表是一种基本的Python数据结构。 它们允许您将多个值分组并使用一个常用名称引用它们。 例如: dogs = ["Roger", "Syd"] 列表可以保存不同类型的值: items = ["Roger", 1, "Syd", True] 您可以使用in运算符检查一个项是否包含在列表中: print("Roger" in items) # True 列表也可以定义为空: items = [] 您可以通过索引引用列表中的项,索引从零开始: items[0] # "Roger" items[1] # 1 items[3] # True 使用相同的表示法,您可以更改存储在特定索引处的值: items[0] = "Roger" 您还可以使用index()方法: items.index("Roger") # 0 items.index("Syd") # 2 与字符串一样,使用负索引将从末尾开始搜索: items[-1] # True 您还可以使用切片提取列表的一部分: items[0:2] # ["Roger", 1] items[2:] # ["Syd", True] 使用len()全局函数可以获得列表中包含的项数,与我们用于获取字符串长度相同: len(items) # 4 您可以使用列表的append()方法将项添加到列表中: items.append("Test") 或者使用extend()方法: items.extend(["Test"]) 您也可以使用+=运算符: items += ["Test"] 提示:使用extend()或+=时,请不要忘记方括号。不要写成items += "Test"或items....