7 votes

Perl push dans un tableau trié

Considérez le bloc de données ci-dessous, comment puis-je maintenir le tri du tableau par le 3ème champ, et continuer à pousser les éléments ?

$VAR1 = [
          '1111',
          'http://...',
           3       #this is one of the 3rd field mentioned above
        ];
$VARN = [
           '5555',
           'http://...',
            0
        ];

Mon code ressemble à ça :

my @curItem = ($item->{id}, $item->{href}, getTotal( $item->{id}) );
push @items, \@curItem;

J'ai trouvé este qui est similaire à ce dont j'ai besoin.

Toute aide est appréciée.

8voto

Brian Roach Points 43787

Vous pouvez utiliser ce module, il vous suffit de fournir le tri :

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] };

(Ou quelque chose de ce genre... Je vais devoir vérifier. En gros, vous devez trier en fonction de l'élément du tableau ref que vous passez)

Edit : Oui, ça marche pour vos données. Je viens de le vérifier :

use Tie::Array::Sorted;

tie @a, "Tie::Array::Sorted", sub { $_[0]->[2] <=> $_[1]->[2] };

push @a, [ "1111", "http:// ...", 3];
push @a, [ "5555", "http:// ...", 0];

foreach $ref (@a)
{
    print $ref . "\n";
    print "@$ref \n";
}

Sorties :

ARRAY(0x9130888)
5555 http:// ... 0
ARRAY(0x90dd818)
1111 http:// ... 3

3voto

BadFileMagic Points 691

Eh bien, Push va ajouter l'élément à la fin de la liste, quoi qu'il arrive. C'est une opération de pile. Je dirais que vous feriez probablement mieux d'utiliser une structure de données différente, comme un hachage, et de ne trier par clé ou par valeur que si nécessaire. Sans plus de détails sur ce que vous essayez d'écrire, il est difficile de se prononcer.

Sinon, vous devrez écrire une sous-routine qui recherche dans la liste le meilleur emplacement d'insertion, puis utilise splice pour injecter l'élément en place. Cela ressemble plus à ce que vous voulez faire, mais je ne suis pas sûr que ce sera particulièrement efficace, car vous devez rechercher le point d'insertion dans la liste chaque fois que vous voulez ajouter un élément tout en maintenant un ordre trié.

1voto

converter42 Points 3264

Si vous ajoutez plus d'une référence de tableau à @items, ajoutez d'abord les références, puis utilisez une transformation schwartzienne pour effectuer une seule opération de tri :

@items = map $_->[1], sort { $a->[0] <=> $b->[0] } map { [ $_->[2], $_ ] } @items;

Randal a écrit une colonne à ce sujet : http://www.stonehenge.com/merlyn/UnixReview/col64.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X