Perl выдвигает в отсортированный массив - PullRequest
7 голосов
/ 13 марта 2011

Рассмотрим блок данных ниже, как я могу сохранить отсортированный массив по 3-му полю и продолжать выдвигать элементы?

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


Мой код выглядит так:

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

Я нашел этот модуль, который похож на то, что мне нужно.

Любая помощь приветствуется.

Ответы [ 3 ]

8 голосов
/ 13 марта 2011

Вы можете использовать этот модуль, вам просто нужно предоставить сортировку:

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

(или что-то в этом роде ... Я должен проверить это. В основном, вам нужно отсортировать на основе элемента массива ref, который вы передаете)

Edit: Да, это работает для ваших данных.Только что проверил:

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";
}

Выходы:

ARRAY(0x9130888)
5555 http:// ... 0
ARRAY(0x90dd818)
1111 http:// ... 3
3 голосов
/ 13 марта 2011

Ну, push собирается добавить элемент в конец списка, несмотря ни на что.Это операция стека.Я бы сказал, что вам, вероятно, лучше использовать другую структуру данных, такую ​​как хеш, а затем сортировать только по ключу или значению, когда это необходимо.Без подробной информации о том, что вы пытаетесь написать, трудно сказать.

В противном случае вам нужно написать подпрограмму, которая ищет в списке лучшее место для вставки, а затем использует соединение для вставки элемента вместо.Это больше похоже на то, что вы хотите сделать, но я не уверен, что это будет особенно эффективно, так как вам придется искать в списке точку вставки каждый раз, когда вы хотите добавить элемент, сохраняя отсортированный порядок.

1 голос
/ 14 марта 2011

Если вы добавляете более одной ссылки на массив в @items, сначала добавьте ссылки, а затем используйте преобразование Шварца для выполнения одной операции сортировки:

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

Рэндал написал об этом колонку: http://www.stonehenge.com/merlyn/UnixReview/col64.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...