Was Ruby (1.8.7) analog zu SortedDictionary in C # /. NET?
-
29-09-2019 - |
Frage
Ich brauche Werte in sortierter Hash in Ruby zu halten (1.8.7). Welche Daten konstruiert passt am besten?
Lösung
Es gibt nichts in der Core-Bibliothek oder die Standardbibliothek jetzt, dass Ihre Rechnung passen.
Es is jedoch eine Feature-Anfrage hinzufügen eine Rot / Schwarz-Baum-Implementierung Ruby 1.9.3 / 2.0.
Wenn Sie in der Lage, die Benutzer zu zwingen, immer nur verwenden XRuby oder JRuby Sie nur eine der Implementierungen von Java verwenden könnte a href <=" http://Download.Oracle.Com/javase/7/docs/api/ java / util / SortedMap.html "rel = "nofollow"> java.util.SortedMap<K, V>
wie java.util.TreeMap<K, V>
.
Wenn Sie in der Lage, die Benutzer zu zwingen, immer nur verwenden Ruby.NET oder IronRuby, könnte man nur von .NET System.Collections.Generic.SortedDictionary<TKey, TValue>
.
Wenn Sie in der Lage sind, Ihre Benutzer nur zu zwingen, jemals verwenden MRI oder YARV, könnten Sie die Ruby/RBTree
Bibliothek. Es könnte auch die Arbeit an Rubinius oder die noch nicht freigegeben JRuby 1.6 . Beachten Sie, dass es scheinen mehrere unabhängige aktualisierte Gabeln dieser Bibliothek in der freien Natur zu sein. Es ist nicht klar, was einer von denen ist die jüngste und / oder am besten gepflegt ein.
Die nur Lösung, die ich kenne, die garantiert ist tragbar zu sein, ist Kanwei Li Algorithmen und Container GSoC 2008-Projekt , die eigentlich zwei Implementierungen von a enthält sortiert, Schlüssel indizierte: Containers::RBTreeMap
basiert auf einer Rot / Schwarz-Baum und Containers::SplayTreeMap
basiert auf einer Splay-Baum .
Andere Tipps
Sie können dies selbst rollen haben, wenn niemand sonst einen besseren Vorschlag hat.
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
Ausgabe:
[1, "later"]
[32, "no"]
[99, "after"]
Array wird durch Tasten sortiert, so dass sie von jedem Anruf sein kann und Sie müssen nur Vergleichsoperatoren auf sie definieren.
Verwenden Sie die gleiche Klasse in c # SortedDictionary:
SortedDictionary KeyValues ??= 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");