如何將雜湊表元素作為排序陣列獲取?
雜湊表是一個非泛型鍵值對集合,其排列方式取決於鍵的雜湊碼。雜湊表用於建立使用雜湊表進行儲存的集合。雜湊表透過計算每個鍵的雜湊碼並將其儲存在內部的桶中來最佳化查詢。當我們從雜湊表訪問特定值時,此雜湊碼將與指定的鍵進行匹配。
此雜湊表集合在 C# 的 System.Collections 名稱空間中定義。“Hashtable”類表示雜湊表集合。此類提供建構函式、方法和屬性來操作雜湊表集合。預設情況下,雜湊表集合是未排序的。如果我們想要一個已排序的雜湊表集合,我們需要將其表示為陣列或 ArrayList 的形式,然後對元素進行排序。
在本文中,我們將瞭解如何將雜湊表元素作為排序陣列獲取。讓我們開始吧。
將雜湊表元素作為排序陣列獲取
我們知道,預設情況下,雜湊表集合是未排序的。由於我們根據鍵建立雜湊表集合,然後向每個鍵新增值,因此對雜湊表集合進行排序非常困難。
如果我們想要對雜湊表集合進行排序,我們必須根據鍵或值對其進行排序。Hashtable 類中沒有直接的方法可以對雜湊表集合進行排序。因此,我們必須採用其他方法。
一種方法是將雜湊表元素(鍵或值)作為排序陣列獲取。為此,我們將遵循以下步驟。
建立一個 Hashtable 物件
使用鍵值對填充此物件
建立一個型別為字串且長度等於雜湊表長度的陣列
基於鍵遍歷雜湊表,並使用每個鍵填充陣列
對生成的陣列進行排序
示例
我們使用 C# 編寫了這種方法,如下所示。
using System; using System.Collections; class Program { public static void Main() { // Create a Hashtable Hashtable langCodes = new Hashtable(); // Add elements to the Hashtable langCodes.Add("C++", "CPlusPlus"); langCodes.Add("C#", "CSharp"); langCodes.Add("Java", "Java"); langCodes.Add("PL", "Perl"); langCodes.Add("PG", "Prolog"); int k = langCodes.Count; // create array of length = hashtable length string[] sortedArray = new string[k]; // Retrieve key values in Array int i = 0; Console.WriteLine("Hashtable langCodes Contents:"); foreach (DictionaryEntry de in langCodes) { Console.WriteLine("{0} ({1}) ", de.Key, de.Value); sortedArray[i] = de.Key.ToString(); i++; } Array.Sort(sortedArray); Console.WriteLine("
Contents of sorted array based on Hashtable keys:"); foreach (var item in sortedArray) { Console.WriteLine(item); } } }
在此程式中,我們定義了一個 Hashtable 物件 langCodes 並使用鍵值對填充它。然後,我們檢索雜湊表的長度,並使用此長度宣告一個數組“sortedArray”。接下來,我們遍歷 langCodes 雜湊表,並使用 langCodes 雜湊表的鍵值填充 sortedArray 物件。
然後,我們使用過濾器 Array.Sort(sortedArray) 對陣列進行排序,並列印此排序後的陣列。
輸出
程式的輸出如下所示。
Hashtable langCodes Contents: PG (Prolog) Java (Java) C# (CSharp) PL (Perl) C++ (CPlusPlus) Contents of sorted array based on Hashtable keys: C# C++ Java PG PL
從輸出中,我們可以看到雜湊表鍵元素被檢索為排序的元素陣列。
現在讓我們來看另一個例子。我們使用上面討論的相同方法。唯一的區別在於,在這個例子中,我們將使用雜湊表的值而不是鍵來填充陣列。
示例
讓我們看看 C# 中的完整程式。
using System; using System.Collections; class Program { public static void Main() { // Create a Hashtable Hashtable numberNames = new Hashtable(); // Add elements to the Hashtable numberNames.Add(12, "Twelve"); numberNames.Add(2, "Two"); numberNames.Add(65, "Sixty Five"); numberNames.Add(15, "Fifteen"); numberNames.Add(18, "Eighteen"); int k = numberNames.Count; //create array of length = hashtable length string[] sortedArray = new string[k]; // Retrieve hashtable values in array. int i = 0; Console.WriteLine("Hashtable langCodes Contents:"); foreach (DictionaryEntry de in numberNames) { Console.WriteLine("{0} ({1}) ", de.Key, de.Value); sortedArray[i] = de.Value.ToString(); i++; } Array.Sort(sortedArray); Console.WriteLine("
Contents of sorted array based on Hashtable values:"); foreach (var item in sortedArray) { Console.WriteLine(item); } } }
此程式有一個 Hashtable 物件 numberNames。我們用數字及其對應的數字名稱填充它。透過遍歷雜湊表,我們用值填充 sortedArray。然後,我們使用 Array.Sort() 過濾器對陣列進行排序,並列印排序後的陣列。
輸出
程式的輸出如下所示。
Hashtable langCodes Contents: 18 (Eighteen) 12 (Twelve) 65 (Sixty Five) 2 (Two) 15 (Fifteen) Contents of sorted array based on Hashtable values: Eighteen Fifteen Sixty Five Twelve Two
從輸出中,我們可以看到陣列的內容(來自雜湊表的值)確實按字母順序排序。我們可以輕鬆地比較雜湊表和排序陣列的輸出。在雜湊表中,輸出未排序。鍵值對隨機顯示。而在陣列中,輸出是排序的。
雖然很難對雜湊表元素進行排序,但我們可以透過將雜湊表元素表示為陣列來進行排序。但是,一次對鍵和值進行排序是不可能的。我們可以將所有鍵檢索到一個數組中,或者將所有值檢索到一個數組中。然後,我們可以使用 Array.Sort() 過濾器對陣列進行排序。我們還可以將雜湊錶轉換為陣列或 ArrayList,然後對它們進行操作。