Frage

Ich brauche Werte in sortierter Hash in Ruby zu halten (1.8.7). Welche Daten konstruiert passt am besten?

War es hilfreich?

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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top