Причина сортировки хеш-таблицы - PullRequest
2 голосов
/ 29 мая 2009

Работодатель попросил меня отсортировать хеш-таблицу. Я всегда думал, что использование хеш-таблицы было в некотором роде непригодным для сортировки. Я ошибаюсь, думая об этом, и если нет, можете ли вы указать мне хороший метод VB.Net (да, убейте меня сейчас, но это старая система) для сортировки хеш-таблицы.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 29 мая 2009

У меня было несколько случаев, когда я считывал пары имя-значение из файла, мне нужно было сохранять их в том порядке, в котором они перечислены в файле, но также требовалось O (1) время поиска. Отсортированная хеш-таблица - это то, как я выполняю оба.

Для .NET 1.1 используйте System.Collections.SortedList. Для .NET 2.0+ используйте System.Collections.Generic.SortedDictionary.

1 голос
/ 29 мая 2009

Мне нравится Ответ DocMax .

Другой вариант:
Прокрутите свое собственное решение в соответствии с тем, что SortedList или SortedDictionary делают изнутри:

  1. помещает ключи (или значения) хеш-таблицы в массив
  2. массив сортировки
  3. перебирать массив и выводить отсортированные данные

(код слегка изменен с здесь )

</p> <pre><code>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 голосов
/ 13 декабря 2011

Попробуйте использовать очередь:

Очередь используется в большинстве ООП, таких как Java, .NET, когда вам нужно получить то, что вам нужно, чтобы следовать правилу FIFO (первым пришел - первым вышел).

Стек 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
...