Domanda

Ho bisogno di tenere i valori in hash ordinata in Ruby (1.8.7). Quali dati Costruii si adatta al meglio?

È stato utile?

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");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top