I come up this structure for your reference. I name it OrderedHash. The code given below is strictly for the purpose to explain the structure more clearly, not any kind of actual implementation.
This OrderedHash structure contains two parts:
- An array, normal array, which contains the key pair values of the OrderedHash. In the Array, those key-value pairs are stored in this sequence: k1, v1, k2, v3, k3, v3...
- A hash, normal hash, its keys are the keys of the OrderedHash, values are indexes point to the key of the actual key value pairs in the above array.
A brief analysis of this structure:
- It reserves the order.
- It is independent, yet not much implementing effort
- We don't invent or implement any hashing algorithm, we simply use a normal hash for indexing.
- Its performance is the same as a normal hash. We don't sacrifice performance.
- This solution DO sacrifice space to gain performance and to reduce implementation effort, it uses as twice as many space used by a normal hash that has the same number of elements.
The following code is only to demo the structure.
package OrderedHash;
use strict;
sub new {
my $self = {};
$self->{INDEX} = {};
$self->{PAIRS} = [];
bless $self;
return $self;
}
sub set {
my ($self, $key, $value) = @_;
push @{$self->{PAIRS}}, $key;
$self->{INDEX}->{$key} = $#{$self->{PAIRS}};
push @{$self->{PAIRS}}, $value;
}
sub get {
my ($self, $key) = @_;
return $self->{PAIRS}->[$self->{INDEX}->{$key} + 1];
}
sub list_in_order {
my $self = shift;
my $is_key = 1;
foreach (@{$self->{PAIRS}}) {
if (!$is_key) {
print "$_\n";
} else {
print "[$_] = ";
}
$is_key = !$is_key;
}
}
1;
use OrderedHash;
use Data::Dumper;
use strict;
my $oh = new OrderedHash;
$oh->set("a", 1);
$oh->set("b", 2);
$oh->set("c", 3);
print Dumper($oh);
$oh->list_in_order;
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.