2

雇主要求我对哈希表进行排序。我一直认为哈希表的使用在某种程度上是不友好的。我这样想是不是错了,如果不是,你能给我指出一个好的 VB.Net(是的,现在杀了我,但它是一个旧系统)对哈希表进行排序的方法。

谢谢。

4

3 回答 3

5

我有几种情况,我从文件中读取名称-值对,需要按照文件中列出的顺序保存它们,但还需要 O(1) 查找时间。一个排序的哈希表是我完成这两者的方式。

对于 .NET 1.1,使用 System.Collections.SortedList。对于 .NET 2.0+,使用 System.Collections.Generic.SortedDictionary。

于 2009-05-29T04:23:39.307 回答
1

我喜欢DocMax 的回答

另一种选择:
按照 SortedList 或 SortedDictionary 在幕后所做的事情推出您自己的解决方案:

  1. 将哈希表键(或值)放入数组
  2. 排序数组
  3. 遍历数组并输出排序数据

(代码从这里稍作修改)

Option Strict On

Imports System.Collections

Public Module modMain
 Public Sub Main()
  Dim myHashTable As New Hashtable

  myHashTable.Add("C", "3")
  myHashTable.Add("A", "1")
  myHashTable.Add("B", "2")

  Dim keys As ICollection = myHashTable.Keys
  Dim keysArray(myHashTable.Count - 1) As String 

  keys.CopyTo(keysArray, 0)
  Array.Sort(keysArray)
  For Each key As String in keysArray
     Console.WriteLine("{0} is {1}", key, myHashTable(key))
  Next
 End Sub
End Module

于 2009-05-29T05:18:09.280 回答
0

尝试使用队列:

当您需要获得遵循 FIFO(先进先出)规则所需的内容时,在大多数 OOP(如 Java、.NET)中都会使用队列。

堆栈是 LIFO - 后进先出...

Dim myQ As Queue(Of KeyValuePair(Of Integer, String)) = New Queue(Of KeyValuePair(Of Integer, String))

myQ.Enqueue(New KeyValuePair(Of Integer, String)(1, "one"))
myQ.Enqueue(New KeyValuePair(Of Integer, String)(2, "two"))
myQ.Enqueue(New KeyValuePair(Of Integer, String)(3, "three"))

'later on you can retrieve objects by
'myQ.Dequeue
Response.Write("<p>Queue</p>")
For Each kvp As KeyValuePair(Of Integer, String) In myQ
    Response.Write(kvp.Key & " is " & kvp.Value & "<br>")
Next

Dim ht As Hashtable = New Hashtable()
ht.Add(1, "one")
ht.Add(2, "two")
ht.Add(3, "three")
Response.Write("<p>Hashtable</p>")
For Each kvp As DictionaryEntry In ht
    Response.Write(kvp.Key & " is " & kvp.Value & "<br>")
Next
于 2011-12-13T12:54:13.800 回答