Sorting array or AssocArrays by value.

Me Here p9e883002 at sneakemail.com
Sun May 4 06:52:42 PDT 2008


Derek Parnell wrote:

> On Sun, 4 May 2008 13:11:23 +0000 (UTC), Me Here wrote:
> 
> > I need them ordered by the values not the keys.
> > 
> > Eg. Given, (whether array or hash):
> > 
> > //index/key  0  1  2  3  4  5  6  7 8 
> > uint a[] =    [ 3, 1,  8, 6, 4, 9, 2, 5, 7 ];
> > 
> > I need to output:
> > // value  - index
> > 1 - 1
> > 2 - 6
> > 3 = 0
> > 4 - 4
> > 5 - 7
> > 6 - 3
> > 7 - 8
> > 8 - 2
> > 9 - 5
> 
> The trick I use for this is to have two AAs. When the set is small,
> performance isn't really an issue.
> 
> 
> import std.stdio;
> void main()
> {
>    int[int] theArray;
>    theArray[0] = 3;
>    theArray[1] = 1;
>    theArray[2] = 8;
>    theArray[3] = 6;
>    theArray[4] = 4;
>    theArray[5] = 9;
>    theArray[6] = 2;
>    theArray[7] = 5;
>    theArray[8] = 7;
> 
>    int[int] altArray;
>    foreach(int i; theArray.keys)
>    {
>        altArray[ theArray[i] ] = i;
>    }
>    
>    foreach(int i; altArray.keys.sort)
>        writefln("%s - %s", i, altArray[i]);
>        
> 
> }

Problem: That works fine if the values in the origianl array are unique.
But in this case thay are not. This is frequency information. 
The index to the array is numeric value of words in a file. 
The values are counts of the occurance of that value in the file,

A truncated sample showing the first of many duplicates.
    0 :      5780646
    1 :       219016
    2 :       138623
    3 :       100037
    4 :        89876
    5 :        61845
    6 :        60890
    7 :        41191
    8 :        60231
    9 :        36885 *
...
   70 :        13069
   71 :        36885 *
   72 :        16121
   73 :        10721

I need to out put this as either:
...
36885: 9, 70
...
or 
36885: 9
36885: 70

Cheers, b.
-- 




More information about the Digitalmars-d mailing list