Qual è Rubino (1.8.7) analogico SortedDictionary in C # /. NET?
-
29-09-2019 - |
Domanda
Ho bisogno di tenere i valori in hash ordinata in Ruby (1.8.7). Quali dati Costruii si adatta al meglio?
Soluzione
Non c'è nulla nella libreria di base o la libreria standard ormai, che si adatta al disegno di legge.
è , però, una richiesta di funzionalità di add un'implementazione Rosso / nero-Tree a Ruby 1.9.3 / 2.0.
Se siete in grado di imporre agli utenti di utilizzare sempre e solo XRuby o JRuby , si potrebbe utilizzare una delle implementazioni di Java java.util.SortedMap<K, V>
come java.util.TreeMap<K, V>
.
Se siete in grado di imporre agli utenti di utilizzare sempre e solo Ruby.NET o IronRuby , si potrebbe utilizzare di .NET System.Collections.Generic.SortedDictionary<TKey, TValue>
.
Se siete in grado di imporre agli utenti di utilizzare sempre e solo la risonanza magnetica o YARV, è possibile utilizzare il Ruby/RBTree
biblioteca. Potrebbe anche lavorare su Rubinius o il non-ancora-rilasciato JRuby 1.6 . Si noti che ci sembrano essere più forcelle aggiornati indipendenti di quella libreria in natura. Non è ovvio, che uno di questi è il più recente e / o migliore mantenuto.
solo soluzione che conosco che è garantito per essere portabile, è Algoritmi Kanwei di Li e contenitori GSoC 2008 progetto , che contiene in realtà due implementazioni di un allineati, la consegna delle chiavi-indicizzato: Containers::RBTreeMap
sulla base di un Rosso / nero-Tree e Containers::SplayTreeMap
sulla base di un albero Splay .
Altri suggerimenti
Si potrebbe avere a rotolare da soli, se nessun altro ha un suggerimento migliore.
class SortedHash
def initialize
@data = []
end
def [](k)
@data.find {|kp,vp| kp == k}.last
end
def []=(k, v)
@data.reject! {|kp,vp| kp == k}
@data << [k, v]
@data = @data.sort_by {|kp,vp| kp}
end
def each(&b)
@data.each(&b)
end
end
sh = SortedHash.new
sh[32] = "no"
sh[1] = "later"
sh[99] = "after"
sh.each do |k,v|
p [k,v]
end
Output:
[1, "later"]
[32, "no"]
[99, "after"]
Array è ordinato per le chiavi, in modo che possano essere di qualsiasi chiamata e basta definire operatori di confronto su di loro.
Utilizzare la stessa classe in C # SortedDictionary:
SortedDictionary valori chiave = new SortedDictionary ();
keyValues.Add(5,"sample5");
keyValues.Add(2, "sample2");
keyValues.Add(6, "sample6");
keyValues.Add(8, "sample8");
keyValues.Add(9, "sample9");
keyValues.Add(1, "sample1");