Podrías hacer lo siguiente: (una de muchas)
Pasas la información a un diccionario, siendo las claves el nombre de la ciudad. Y los valores, una referencia a un arreglo que almacena los números de cada ciudad.
Luego, por cada ciudad, ordenas los arreglos de mayor a menor y quitas el primer elemento. Si el arreglo no queda vacío, actualizas el valor de cada arreglo al formato de salida que quieres y lo guardas en el vector resultado.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
use diagnostics
;
my @vector = (
"6\tRoma",
"3\tParis",
"5\tMadrid",
"7\tYork",
"9\tYork",
"2\tRoma",
"4\tParis",
"1\tRoma",
);
my %valores;
for my $item (@vector) {
my ($valor, $ciudad) = split "\t", $item;
push @{$valores{$ciudad}}, $valor;
}
use Data
::Dumper::Names;
print Dumper
\%valores;
undef @vector;
for my $ciudad (keys %valores) {
my @valores = @{$valores{$ciudad}};
@valores = sort { $a < $b } @valores;
shift @valores;
if (@valores) {
for my $valor (@valores) {
$valor = "$valor\t$ciudad\n";
}
push @vector, @valores;
}
}
print Dumper
\@vector;Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Sale:
Using perl Syntax Highlighting
%valores = (
'Paris' => [
'3',
'4'
],
'Madrid' => [
'5'
],
'Roma' => [
'6',
'2',
'1'
],
'York' => [
'7',
'9'
]
);
@vector = (
'3 Paris
',
'2 Roma
',
'1 Roma
',
'7 York
'
);Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4