in reply to Compare Lists (Non Unique Intersection)
I don't think the "way to do it" of your update really does it, if I understand correctly what "it" is ... that way would result in two copies of any element that was twice in @temp2, whether it was once, twice, or three or more times in @temp.
Provided I understand correctly what "it" is, I'd count up and down:
my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2;
This will preserve the order of elements of @temp2, until the count (initially the frequency in @temp of that element's string equivalence class) has been exhausted.
Update: Might as well make a function, while I'm at it:
# my @non_unique_intersection = nonunique_intersect( \@temp, \@temp2 ) +; sub nonunique_intersect { my ($x, $y) = @_; my %count; $count{$_}++ for @$x; my @return = grep { $count{$_}-->0 } @$y; return wantarray ? @return : \@return; }
Update 2: For your next challenge, the non-unique intersection, leftovers from @temp, and leftovers from @temp2; assuming that the bag of ( @temp, @temp2 ) is supposed to be the same as the bag of ( (@non_unique_intersection) x 2, @leftovers, @leftovers2 ):
my %count; $count{$_}++ for @temp; my @non_unique_intersection = grep { $count{$_}-->0 } @temp2; my (@leftovers, @leftovers2); push @{$count{$_}>0 ? \@leftovers : \@leftovers2}, ($_) x abs($count{$ +_}) for keys %count;
print "Just another Perl ${\(trickster and hacker)},"
The Sidhekin proves Sidhe did it!
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Compare Lists (Non Unique Intersection)
by rsiedl (Friar) on Jul 28, 2006 at 06:45 UTC |