```On Mon, 26 Sep 2005, Bob Hutchison wrote:

> Hi,
>
> Is there a Hash-like class that maintains insertion order and, ideally,
> allows 'retrieval' by either key or index? I googled around for this but
> can't seem to hit on a query string that is useful.
>
> In a perfect implementation I'd be able to do something like:
>
> hash = HashMaintainingInsertionOrder.new
> hash["a"] = "aaa"
> hash["b"] = "bbb"
> hash["c"] = "ccc"
>
> assert_equal(hash["a"], hash[0])
> assert_equal(hash["b"], hash[1])
> assert_equal(hash["c"], hash[2])
>
> Thanks,
> Bob
>
> ----
> Bob Hutchison          -- blogs at <http://www.recursive.ca/hutch/>
> Raconteur              -- <http://www.raconteur.info/>

harp:~ > cat a.rb
require 'arrayfields'

a = %w( aaa bbb ccc )
a.fields = %w( a b c )

p a['a'] = a[0]
p a['b'] = a[1]
p a['c'] = a[2]

harp:~ > ruby a.rb
"aaa"
"bbb"
"ccc"

or

harp:~ > cat a.rb
require 'arrayfields'

class HashMaintainingInsertionOrder < ::Array
def initialize
self.fields = []
end
end

a = HashMaintainingInsertionOrder::new

a['a'] = 'aaa'
a['b'] = 'bbb'
a['c'] = 'ccc'

p a['a'] = a[0]
p a['b'] = a[1]
p a['c'] = a[2]

harp:~ > ruby a.rb
"aaa"
"bbb"
"ccc"

this works because assigning to non-existent fields appends a key/val pair.

arrayfields is at

http://codeforpeople.com/lib/ruby/arrayfields/

and cross-listed on the raa.  you also may want to check out my personal lib,
alib, at

http://codeforpeople.com/lib/ruby/alib/

which contains an OrderedHash impl.  use like

require 'alib'

oh = OrderedHash::new

but this only returns keys in order for methods like each - it does not allow
look-up by number __or__ field.

hth.

-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| Your life dwells amoung the causes of death
| Like a lamp standing in a strong breeze.  --Nagarjuna
===============================================================================

```