Odebrani opakujicich se prvku z pole

Honza Pazdziora adelton na informatics.muni.cz
Pondělí Duben 12 23:34:26 MEST 1999


> > 
> > potreboval bych nejakej (jednduchej) zpusob jak odebrat z pole prvky, ktere
> > se tam uz vyskytuji.
> > Patrne nejlepsi zpusob je priradit je jako klice do hashe a pak ty stejny
> > vypadnou, jenomze jak to udelat, kdyz potrebuju zachovat jejich poradi?
> 
> Coz takhle:
> 
> my %hash;
> my $pom;
> for (@pole) {
> 	$hash{sprintf('%10d',$pom)."$pole[$pom]"} = 1;
> }
> 
> @pole = map { /^.{10}(.*)$/; $1 } sort keys %hash;

Hmmm, pusobi na me podezrele, ze mixujes $pom jako hodnotu prvku pole
a $pom jako index do toho sameho pole. Krome toho ty regularni vyrazy
a tak mi prijde jako overkill.

Ciste Ceckovym pristupem by se to dalo udelat

	my %hash;
	for (my $i = 0; $i < @pole; $i++) {
		$hash{$pole[$i]} = $i if not defined $hash{$pole[$i]};
		}
	my @out = sort { $hash{$a} <=> $hash{$b} } keys %hash;

coz se da stejne dobre napsat

	my %hash;
	for (my $i = @pole; $i; ) {
		$i--;
		$hash{$pole[$i]} = $i;
		}
	my @out = sort { $hash{$a} <=> $hash{$b} } keys %hash;

a usetrili jsme ten test a protoze vime, ze hodnoty toho hashe %hash
jsou unikatni, protoze jsou to indexy do @pole, muzeme napsat i

	my @out = map { $pole[$_] } sort { $a <=> $b } values %hash;

Zde je potreba si dat bacha na to, abychom vnutili numericke
porovnavani.

Je mozne samozrejme udelat to i jednim pruchodem,

	for (@pole) {
		push @out, $_ unless defined $hash{$_};
		$hash{$_} = 1;
		}

kde se vyhneme indexum a trideni, coz je prijemne, a navic for (@pole)
vypada velmi Perlove. Nenapada me zpusob, jak to udelat jednim radkem,
bez pouziti toho pomocneho hashe, takze pokud se smirime s tim, ze tam
ten jeden hash navic bude, tak asi doporucuji ten posledni pripad.

Za domaci ulohu davam empiricky overit, ze pomer casu je asi 1 : 2 : 3
ve prospech posledni varianty (hint: use Benchmark ;-)

------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 make vmlinux.exe			-- SGI Visual Workstation Howto
Any spam sent to my email will be rewarded by complaint to your ISP abuse
  team and abuse teams of servers that relayed that message. It works.


Další informace o konferenci Perl