Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Conditional Sorting

by monkfan (Curate)
on May 11, 2007 at 05:06 UTC ( #614814=perlquestion: print w/ replies, xml ) Need Help??
monkfan has asked for the wisdom of the Perl Monks concerning the following question:

Dear all,
Suppose I have the following array and hash:
my @arr = ('foo','bar','qux','foo1','bar1','qux1'); my $hash = { '4-5' => '0.750', '0-4' => '0.167', '0-2' => '0.600', '2-3' => '0.200', '2-4' => '0.300', '0-3' => '0.300', '2-5' => '0.400', '1-2' => '0.550', '1-5' => '0.273', '3-4' => '0.300', '1-4' => '0.182', '0-1' => '0.917', '3-5' => '0.400', '0-5' => '0.250', '1-3' => '0.300' };
Now the key and value of $hash represent the following:
'x-y' => 'VALUE' x and y represent the index of the element in @arr x and y are reversible so for example: '0-3' => '0.300', means that 'foo' and 'foo1' has value 0.300 OR 'foo1' and 'foo' has value 0.300
Now my question is, how can we sort decendingly @arr_sorted, such that for every index 'z' in @arr, the VALUE of its (z,y) <= (z,y+1)?

Members of @arr_sorted is exactly the same as @arr, only sorted according to the condition above. And yes, every 'z' has its corresponding @arr_sorted.

I'm not sure how to proceed from here:
foreach my $z (0 .. ($#arr-1)) { my @arr_sorted = sort{???} @arr; }
Updated.

Regards,
Edward

Comment on Conditional Sorting
Select or Download Code
Re: Conditional Sorting
by jdporter (Canon) on May 11, 2007 at 05:31 UTC

    It appears that @arr are the nodes in a graph, and %hash are the weights of all the edges in the graph. (It's undirected, and fully connected.) So now you want to sort the nodes — but by what, exactly, is not clear. With the information given, I would surmise that the values for each node come from the weights of all its edges. If so, then the following:

    use strict; use warnings; my @arr = ('foo','bar','qux','foo1','bar1','qux1'); my %hash = ( '4-5' => '0.750', '0-4' => '0.167', '0-2' => '0.600', '2-3' => '0.200', '2-4' => '0.300', '0-3' => '0.300', '2-5' => '0.400', '1-2' => '0.550', '1-5' => '0.273', '3-4' => '0.300', '1-4' => '0.182', '0-1' => '0.917', '3-5' => '0.400', '0-5' => '0.250', '1-3' => '0.300' ); my @nodew; for ( keys %hash ) { my $v = $hash{$_}; $nodew[$_] += $v for /(\d+)/g; } my @sorted_node_indices = sort { $nodew[$a] <=> $nodew[$b] } 0 .. $#nodew; my @arr_sorted = @arr[ @sorted_node_indices ];

    Update: I see, you want, for each node, the list of its neighbor nodes sorted by edge weight.

    use strict; use warnings; my @arr = ('foo','bar','qux','foo1','bar1','qux1'); my %hash = ( '4-5' => '0.750', '0-4' => '0.167', '0-2' => '0.600', '2-3' => '0.200', '2-4' => '0.300', '0-3' => '0.300', '2-5' => '0.400', '1-2' => '0.550', '1-5' => '0.273', '3-4' => '0.300', '1-4' => '0.182', '0-1' => '0.917', '3-5' => '0.400', '0-5' => '0.250', '1-3' => '0.300' ); my %edgew; for ( keys %hash ) { my( $from, $to ) = @arr[ /(\d+)/g ]; $edgew{$from}{$to} = $edgew{$to}{$from} = $hash{$_}; } for my $from ( sort keys %edgew ) { print "$from:\n"; print "\t$_ : $edgew{$from}{$_}\n" for sort { $edgew{$from}{$a} <=> $edgew{$from}{$b} } keys %{ $edgew{$from} }; }
    A word spoken in Mind will reach its own level, in the objective world, by its own weight
Re: Conditional Sorting
by Zaxo (Archbishop) on May 11, 2007 at 05:46 UTC

    Does your data source guarantee that your condition is possible?

    If, say, '4-5' => .001 with the rest unaltered, then the data is incompatible with the sort you want. That suggests that you want data validation, not sorting.

    After Compline,
    Zaxo

Re: Conditional Sorting
by jesuashok (Curate) on May 11, 2007 at 07:00 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://614814]
Approved by Zaxo
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (15)
As of 2015-03-03 15:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When putting a smiley right before a closing parenthesis, do you:









    Results (75 votes), past polls