如何将哈希表元素作为排序数组获取?

csharpserver side programmingprogramming更新于 2025/5/10 16:52:17

哈希表是非通用的键值对集合,这些键值对按照键的哈希码排列。哈希表用于创建使用哈希表进行存储的集合。哈希表通过计算每个键的哈希码来优化查找,并将其内部存储在篮子中。当我们从哈希表中访问特定值时,此哈希码将与指定的键匹配。

此哈希表集合在 C# 的 System.Collections 命名空间中定义。表示哈希表集合的类是"Hashtable"类。此类提供构造函数、方法和属性来操作哈希表集合。默认情况下,哈希表集合未排序。如果我们想要一个已排序的哈希表集合,我们需要将其表示为数组或 ArrayList 的形式并对元素进行排序。

在本文中,我们将了解如何将哈希表元素作为已排序数组获取。让我们开始吧。

将哈希表元素作为已排序数组获取

我们知道,默认情况下,哈希表集合是未排序的。对哈希表集合进行排序可能非常困难,因为我们根据键创建哈希表集合,然后向每个键添加值。

如果我们想对哈希表集合进行排序,我们必须按键或值进行排序。Hashtable 类中没有直接对哈希表集合进行排序的方法。所以我们不得不求助于其他方法。

其中一种方法是将哈希表元素(键或值)作为已排序数组获取。为此,我们将遵循下面列举的步骤。

  • 创建一个 Hashtable 对象

  • 用键值对填充此对象

  • 创建一个字符串类型的数组,长度 = 哈希表的长度

  • 根据键遍历哈希表,并用每个键填充数组

  • 对生成的数组进行排序

示例

我们已经使用 C# 编写了这种方法,如下所示。

using System;
using System.Collections;
class Program {
   public static void Main() {
     
        // 创建哈希表
        Hashtable langCodes = new Hashtable();
        
        // 将元素添加到哈希表
        langCodes.Add("C++", "CPlusPlus");
        la​​ngCodes.Add("C#", "CSharp");
        la​​ngCodes.Add("Java", "Java");
        la​​ngCodes.Add("PL", "Perl");
        la​​ngCodes.Add("PG", "Prolog");
        int k = langCodes.Count;
        
        // 创建长度 = 哈希表长度的数组
        string[] sortedArray = new string[k];
        
        // 检索数组中的键值
        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 哈希表的键值填充已排序的数组对象。

然后,我们使用过滤器 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() {
// 创建 Hashtable
Hashtable numberNames = new Hashtable();

        // 将元素添加到 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;
        
        //创建长度 = 哈希表长度的数组
        string[] sortedArray = new string[k];
        
        // 检索数组中的哈希表值。
        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 并对其进行处理。


相关文章