in reply to Re: Re: Re: sort hash elements...
in thread sort hash elements...

Hi Particle,

Many thanks for taking time to explain:)

I now understand what "my %hash = map { split } @names_marks;" does - splits the array of elements into keys and values - each array element contains a name and a score delimited by space. The 'map' can be replaced by a 'for' loop to achieve the same result.

With regard to name uniqueness, the program that I'm testing will need to parse a large number of entries (names of pupils for a particular schooling level and their scores for a certain subject). I want to be able to deal with situations where there is more than one person with the same name. My approach was to append a person's name to her score to make the name unique. But as you've pointed out, if the two persons have the same score, the name (key) will still not be unique. I'm still thinking how I could get around that problem. Any advice will be appreciated :)

cheers,

kiat

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: sort hash elements...
by particle (Vicar) on Mar 28, 2002 at 13:33 UTC
    perhaps you should consider giving each student a unique id number, and use that as the key for all your data. for instance:
    my %id_to_name = ( 1 => 'keith', 2 => 'rob', 3 => 'eric', 4 => 'rob', # etc. ); my %id_to_mark = ( 1 => 90, 2 => 52, 3 => 86, 4 => 71, # etc. );
    as long as you can match a unique id to a name, you can address the proper student's marks. if it's not possible to organize your data this way (for instance names are not given in the same order each time,) then you won't be able to implement it this way, using arrays or hashes.

    if you're tracking any particular student, you'll need something unique to identify her. if that information is not available in the data, there's no way to do it. if the information is there, find it, and use it for the key in your hash.

    if you're not tracking any particular student, and are trending the group as a whole, you can key the hash on the score, keep either a count of students with that score, or an array of student names as hash values. here's an example:

    my %scores_to_names = ( 90 => [ 'keith' ], 52 => [ 'rob', 'dave' ], # etc. );
    if you find this might be a way to go, look in perldsc (perl data structures cookbook) for examples. and use Data::Dumper to see what your structure looks like, it's really handy.

    ~Particle ;Þ p.s. if your data is given in the same order every time, perhaps you could implement this using arrays. the unique id would be the position in the array, and the values could be in different arrays, like @names, @marks, etc. or, the data could live in an array of arrays. again, find examples in perldsc. good luck!