2009-05-29 4 views
2

Ich wurde von einem Arbeitgeber gebeten, eine Hashtabelle zu sortieren. Ich dachte immer, dass die Verwendung einer Hash-Tabelle in gewisser Weise nicht sortierfreundlich ist. Habe ich falsch daran, dies zu denken, und wenn nicht, können Sie mich auf eine gute VB.Net-Methode (Ja Töte mich jetzt, aber es ist ein altes System) zeigen, eine Hash-Tabelle zu sortieren.Grund für das Sortieren einer Hash-Tabelle

Danke.

+1

Enthält diese Arbeitgeber spitzes Haar? – Josh

+1

Es erinnert mich an Dilbert ... – yinyueyouge

+0

Ich fand zwei einfache Lösungen dazu http://blog.larmib.com/2012/sorting-vb-net-hashtable-sorting-resolved/ – LJ2010

Antwort

5

Ich hatte mehrere Fälle, in denen ich Name-Wert-Paare aus einer Datei lesen, müssen sie in der Reihenfolge, die sie in der Datei aufgeführt waren, aber auch müssen O (1) Lookup-Zeiten. Eine sortierte Hashtable ist, wie ich beides bearbeite.

Verwenden Sie für .NET 1.1 System.Collections.SortedList. Verwenden Sie für .NET 2.0+ System.Collections.Generic.SortedDictionary.

1

Ich mag DocMax's answer.

Eine weitere Option:
Rolle eine eigene Lösung nach dem Vorbild dessen, was SortedList oder SortedDictionary ist unter der Haube zu tun:

  1. die Hash-Tabellenschlüssel setzen (oder Werte) in einem Array
  2. sortieren Array
  3. iterieren über Array und Ausgangs sortierten Daten

(Code leicht von here modifiziert)

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

Versuchen Sie, eine Queue mit:

Eine Warteschlange in den meisten OOP wie Java, .NET verwendet, wenn Sie erhalten müssen, was Sie das FIFO (first in first out) Regel folgen müssen.

Ein Stapel ist LIFO - last out in erster ...

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 
Verwandte Themen