Parent

Included Modules

Class Index [+]

Quicksearch

Dictionary

The Dictionary class is a Hash that preserves order. So it has some array-like extensions also. By defualt a Dictionary object preserves insertion order, but any order can be specified including alphabetical key order.

Usage

Just require this file and use Dictionary instead of Hash.

  # You can do simply
  hsh = Dictionary.new
  hsh['z'] = 1
  hsh['a'] = 2
  hsh['c'] = 3
  p hsh.keys     #=> ['z','a','c']

  # or using Dictionary[] method
  hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
  p hsh.keys     #=> ['z','a','c']

  # but this don't preserve order
  hsh = Dictionary['z'=>1, 'a'=>2, 'c'=>3]
  p hsh.keys     #=> ['a','c','z']

  # Dictionary has useful extensions: push, pop and unshift
  p hsh.push('to_end', 15)       #=> true, key added
  p hsh.push('to_end', 30)       #=> false, already - nothing happen
  p hsh.unshift('to_begin', 50)  #=> true, key added
  p hsh.unshift('to_begin', 60)  #=> false, already - nothing happen
  p hsh.keys                     #=> ["to_begin", "a", "c", "z", "to_end"]
  p hsh.pop                      #=> ["to_end", 15], if nothing remains, return nil
  p hsh.keys                     #=> ["to_begin", "a", "c", "z"]
  p hsh.shift                    #=> ["to_begin", 30], if nothing remains, return nil

Usage Notes

Public Class Methods

[](*args) click to toggle source
# File lib/dictionary.rb, line 66
    def [](*args)
      hsh = new
      if Hash === args[0]
        hsh.replace(args[0])
      elsif (args.size % 2) != 0
        raise ArgumentError, "odd number of elements for Hash"
      else
        while !args.empty?
          hsh[args.shift] = args.shift
        end
      end
      hsh
    end
alpha(*args, &block) click to toggle source

Alternate to new which creates a dictionary sorted by key.

  d = Dictionary.alpha
  d["z"] = 1
  d["y"] = 2
  d["x"] = 3
  d  #=> {"x"=>3,"y"=>2,"z"=>2}

This is equivalent to:

  Dictionary.new.order_by { |key,value| key }
# File lib/dictionary.rb, line 98
    def alpha(*args, &block)
      new(*args, &block).order_by_key
    end
auto(*args) click to toggle source

Alternate to new which auto-creates sub-dictionaries as needed.

  d = Dictionary.auto
  d["a"]["b"]["c"] = "abc"  #=> { "a"=>{"b"=>{"c"=>"abc"}}}
# File lib/dictionary.rb, line 107
    def auto(*args)
      #AutoDictionary.new(*args)
      leet = lambda { |hsh, key| hsh[key] = new(&leet) }
      new(*args, &leet)
    end
new(*args, &blk) click to toggle source

New Dictiionary.

# File lib/dictionary.rb, line 116
  def initialize(*args, &blk)
    @order = []
    @order_by = nil
    if blk
      dict = self                                  # This ensure autmatic key entry effect the
      oblk = lambda{ |hsh, key| blk[dict,key] }    # dictionary rather then just the interal hash.
      @hash = Hash.new(*args, &oblk)
    else
      @hash = Hash.new(*args)
    end
  end
new_by(*args, &blk) click to toggle source

Like new but the block sets the order.

# File lib/dictionary.rb, line 82
    def new_by(*args, &blk)
      new(*args).order_by(&blk)
    end

Public Instance Methods

<<(kv) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 319
  def <<(kv)
    push(*kv)
  end
==(hsh2) click to toggle source

def ==( hsh2 )

  return false if @order != hsh2.order
  super hsh2

end

# File lib/dictionary.rb, line 193
  def ==(hsh2)
    if hsh2.is_a?( Dictionary )
      @order == hsh2.order &&
      @hash  == hsh2.instance_variable_get("@hash")
    else
      false
    end
  end
[](k) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 202
  def [] k
    @hash[ k ]
  end
[]=(k, i=nil, v=nil) click to toggle source

Store operator.

  h[key] = value

Or with additional index.

 h[key,index] = value
# File lib/dictionary.rb, line 218
  def []=(k, i=nil, v=nil)
    if v
      insert(i,k,v)
    else
      store(k,i)
    end
  end
clear() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 236
  def clear
    @order = []
    @hash.clear
  end
delete( key ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 241
  def delete( key )
    @order.delete( key )
    @hash.delete( key )
  end
delete_if() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 262
  def delete_if
    order.clone.each { |k| delete k if yield(k,@hash[k]) }
    self
  end
dup() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 344
  def dup
    a = []
    each{ |k,v| a << k; a << v }
    self.class[*a]
  end
each() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 256
  def each
    order.each { |k| yield( k,@hash[k] ) }
    self
  end
Also aliased as: each_pair
each_key() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 246
  def each_key
    order.each { |k| yield( k ) }
    self
  end
each_pair() click to toggle source

Alias for each

each_value() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 251
  def each_value
    order.each { |k| yield( @hash[k] ) }
    self
  end
empty?() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 393
  def empty?
    @hash.empty?
  end
fetch(k, *a, &b) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 206
  def fetch(k, *a, &b)
    @hash.fetch(k, *a, &b)
  end
first(x=nil) click to toggle source
# File lib/dictionary.rb, line 377
  def first(x=nil)
    return @hash[order.first] unless x
    order.first(x).collect { |k| @hash[k] }
  end
has_key?(key) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 397
  def has_key?(key)
    @hash.has_key?(key)
  end
insert( i,k,v ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 226
  def insert( i,k,v )
    @order.insert( i,k )
    @hash.store( k,v )
  end
inspect() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 338
  def inspect
    ary = []
    each {|k,v| ary << k.inspect + "=>" + v.inspect}
    '{' + ary.join(", ") + '}'
  end
invert() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 277
  def invert
    hsh2 = self.class.new
    order.each { |k| hsh2[@hash[k]] = k }
    hsh2
  end
key?(key) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 401
  def key?(key)
    @hash.key?(key)
  end
keys() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 273
  def keys
    order
  end
last(x=nil) click to toggle source
# File lib/dictionary.rb, line 383
  def last(x=nil)
    return @hash[order.last] unless x
    order.last(x).collect { |k| @hash[k] }
  end
length() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 388
  def length
    @order.length
  end
Also aliased as: size
merge( hsh2 ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 357
  def merge( hsh2 )
    self.dup.update(hsh2)
  end
merge!( hsh2 ) click to toggle source

Alias for update

order() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 128
  def order
    reorder if @order_by
    @order
  end
order_by( &block ) click to toggle source

Keep dictionary sorted by a specific sort order.

# File lib/dictionary.rb, line 135
  def order_by( &block )
    @order_by = block
    order
    self
  end
order_by_key() click to toggle source

Keep dictionary sorted by key.

  d = Dictionary.new.order_by_key
  d["z"] = 1
  d["y"] = 2
  d["x"] = 3
  d  #=> {"x"=>3,"y"=>2,"z"=>2}

This is equivalent to:

  Dictionary.new.order_by { |key,value| key }

The initializer Dictionary#alpha also provides this.

# File lib/dictionary.rb, line 155
  def order_by_key
    @order_by = lambda { |k,v| k }
    order
    self
  end
order_by_value() click to toggle source

Keep dictionary sorted by value.

  d = Dictionary.new.order_by_value
  d["z"] = 1
  d["y"] = 2
  d["x"] = 3
  d  #=> {"x"=>3,"y"=>2,"z"=>2}

This is equivalent to:

  Dictionary.new.order_by { |key,value| value }
# File lib/dictionary.rb, line 173
  def order_by_value
    @order_by = lambda { |k,v| v }
    order
    self
  end
pop() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 333
  def pop
    key = order.last
    key ? [key,delete(key)] : nil
  end
push( k,v ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 323
  def push( k,v )
    unless @hash.include?( k )
      @order.push( k )
      @hash.store( k,v )
      true
    else
      false
    end
  end
reject(&block) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 283
  def reject(&block)
    self.dup.delete_if(&block)
  end
reject!( &block ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 287
  def reject!( &block )
    hsh2 = reject(&block)
    self == hsh2 ? nil : hsh2
  end
reorder() click to toggle source
# File lib/dictionary.rb, line 180
  def reorder
    if @order_by
      assoc = @order.collect{ |k| [k,@hash[k]] }.sort_by(&@order_by)
      @order = assoc.collect{ |k,v| k }
    end
    @order
  end
replace(hsh2) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 292
  def replace(hsh2)
    case hsh2
    when Hash
      @order = hsh2.keys
      @hash  = hsh2
    else
      @order = hsh2.order
      @hash  = hsh2.hash
    end
    reorder
  end
reverse() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 372
  def reverse
    dup.reverse!
  end
reverse!() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 367
  def reverse!
    @order.reverse!
    self
  end
select() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 361
  def select
    ary = []
    each { |k,v| ary << [k,v] if yield k,v }
    ary
  end
shift() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 304
  def shift
    key = order.first
    key ? [key,delete(key)] : super
  end
size() click to toggle source

Alias for length

store( a,b ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 231
  def store( a,b )
    @order.push( a ) unless @hash.has_key?( a )
    @hash.store( a,b )
  end
to_a() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 405
  def to_a
    ary = []
    each { |k,v| ary << [k,v] }
    ary
  end
to_h() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 419
  def to_h
    @hash.dup
  end
to_hash() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 415
  def to_hash
    @hash.dup
  end
to_s() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 411
  def to_s
    self.to_a.to_s
  end
unshift( k,v ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 309
  def unshift( k,v )
    unless @hash.include?( k )
      @order.unshift( k )
      @hash.store( k,v )
      true
    else
      false
    end
  end
update( hsh2 ) click to toggle source

(Not documented)

# File lib/dictionary.rb, line 350
  def update( hsh2 )
    hsh2.each { |k,v| self[k] = v }
    reorder
    self
  end
Also aliased as: merge!
values() click to toggle source

(Not documented)

# File lib/dictionary.rb, line 267
  def values
    ary = []
    order.each { |k| ary.push @hash[k] }
    ary
  end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.