While you can shoehorn sort into doing this, it will not be as clear as a more straightforward algorithm. Furthermore should your requirements change (eg some dataset unexpectedly has a circular dependency and your code needs to detect that), it will be easier to make that change with a more straightforward solution. Something like this:
sub rank_objects { my @objects = @_; my $n = 0; my @next_objects = grep {not $_->depends_on} @objects; my @current_objects; while (@next_objects and $n < @objects) { $n++; @current_objects = @next_objects; @next_objects = (); for my $object (@current_objects) { $object->set_rank($n); push @next_objects, $object->depended_on_by; } } my @circular = @next_objects, grep {not $_->rank} @objects; if (@circular) { # We have circular dependencies, report that somehow. # In production code I'd actually try to report one of # the cycles here. die "Circular dependencies found."; } }
In reply to Re: Partial sort for dependency graph
by tilly
in thread Partial sort for dependency graph
by throop
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |