2009-05-29 7 views
2

Un employeur m'a demandé de trier une table de hachage. J'ai toujours pensé que l'utilisation d'une table de hachage était d'une manière non-amicale. Ai-je tort de penser cela, et si non, pouvez-vous me désigner un bon VB.Net (Yes Kill me now, mais c'est un ancien système) méthode de tri d'une table de hachage.Raison du tri d'une table de hachage

Merci.

+1

Est-ce que cet employeur ont les cheveux Pointy? – Josh

+1

Cela me fait penser à Dilbert ... – yinyueyouge

+0

J'ai trouvé deux solutions faciles à ce sujet: http://blog.larmib.com/2012/sorting-vb-net-hashtable-sorting-resolved/ – LJ2010

Répondre

5

J'ai eu plusieurs cas où j'ai lu des paires nom-valeur d'un fichier, besoin de les garder dans l'ordre où ils ont été répertoriés dans le fichier, mais aussi besoin de O (1) temps de recherche. Une hashtable triée est la façon dont j'accomplis les deux.

Pour .NET 1.1, utilisez System.Collections.SortedList. Pour .NET 2.0+, utilisez System.Collections.Generic.SortedDictionary.

1

J'aime DocMax's answer.

Une autre option:
Réaliser votre propre solution le long des lignes de ce que SortedList ou SortedDictionary est en train de faire sous le capot:

  1. mettre les clés de table de hachage (ou valeurs) dans une sorte tableau
  2. tableau
  3. itérer sur réseau et les données de sortie triées

(Code légèrement modifié par here)

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 

0

Essayez d'utiliser une file d'attente:

Une file d'attente est utilisé dans la plupart POO comme Java, .NET lorsque vous avez besoin pour obtenir ce que vous devez suivre le FIFO (premier entré, premier sorti) règle.

Une pile est LIFO - dernier entré, premier sorti ...

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 
Questions connexes