Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation

Re: Perl sorting unique values

by sundialsvc4 (Abbot)
on Jun 22, 2011 at 15:55 UTC ( #910924=note: print w/replies, xml ) Need Help??

in reply to Perl sorting unique values

When you want to find the unique entries in (especially) a large collection of items, first you sort it, then you walk through the list to fetch the unique items.   (Thanks to the sort, all duplicate items are adjacent.)   You cannot, AFAIK, do this in just one step, unless the sort-utility or package that you are using provides that option.

TMTOWTDI, of course.   Memory-based tricks such as hash-tables are certainly fine up to a point.   The sort-then-uniq strategy will handle data of any quantity and will do so with linear performance.

Existing CPAN packages, as mentioned, are always to be looked-for first.   (No matter what you’re doing, it has been done before.)

Replies are listed 'Best First'.
Re^2: Perl sorting unique values
by BrowserUk (Patriarch) on Jun 22, 2011 at 17:01 UTC
    The sort-then-uniq strategy will handle data of any quantity and will do so with linear performance.

    When will you get it through your thick skull that sorting is not linear; it is O(N log N). And disk sorting slower still.

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Hi All, I used wind's method but with slight modifications as below
      ##########################prints unique and sorted salary use strict; use warnings; my %hash; open my $fh, '<', 'abc.txt' or die $!; while (<$fh>) { chomp; my ($key, $val , $val1) = split '\|'; $hash{$val1}++; } print "$_\n" for sort keys %hash; ----abc.txt------ P|PERL|50000 Paa|JAVA|20000 Poo|VB|10000 AB|SAN|20000 ABCD|CSS|500 PQRS|HTML|200 --The output is-- 10000 200 20000 500 50000
      Though i sorted and printed the unique values,the issue is maybe we may want to print it like
      50000 20000 10000 500 200
      But according to "Perl in 21 days" sort only compares the first digit/letter and sorts accordingly. For printing the above specified output we may want to write a subroutine which compares two values and then swaps them and prints the output. And one more thing, we are not allowed to install CPAN modules in our firm,as we have restricted access.So whatever we do we have to use existing functions and code.
        Got the desired output:
        # use strict; #use warnings; my %hash; open my $fh, '<','abc.txt' or die $!; while (<$fh>) { chomp; my ($key, $val , $val1) = split '\|'; $hash{$val1}++; } @sorted= reverse sort keys %hash; #print "After reverse sorting @sorted\n"; ################sorts and prints the array salaries in descending orde +r for($i=0;$i<=20;$i++) { for($j=$i+1;$j<=20;$j++) { if ($sorted[$i] < $sorted[$j]) { $temp = $sorted[$i]; $sorted[$i] = $sorted[$j]; $sorted[$j] = $temp; } } } print "The salaries in unique and sorted descending order are\n"; print "@sorted\n";
        Thanks All.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://910924]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (7)
As of 2023-03-26 21:13 GMT
Find Nodes?
    Voting Booth?
    Which type of climate do you prefer to live in?

    Results (63 votes). Check out past polls.