Вставка ссылок на массивы в кучу Perl - PullRequest
2 голосов
/ 30 июня 2010

Я вставляю ссылки на 2-мерные массивы в мою кучу в Perl.Как мне определить атрибут 'elements' при создании моей кучи, чтобы я мог правильно использовать функцию сравнения?

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Array => 0]
                             );

sub byNumOrStr
{
    my ( $a, $b ) = @_;

    $b->[0] <=> $a->[0]  #0-th element is a number. 
            ||
    $a->[1] cmp $b->[1]; #1-st element is a number
}

Я продолжаю возвращать эту ошибку:

Невозможно использовать строку ("2.55") в качестве ссылки ARRAY, когда используются "строгие ссылки" ... (Это означает, что явозможно, придется сравнить мою «числовую строку» численно)

Ответы [ 2 ]

0 голосов
/ 30 июня 2010

Сортировка двумерного массива на самом деле не имеет смысла - когда вы сортируете что-то, есть определенный порядок.Наличие двух критериев сортировки не делает его двумерным списком ... Вы имеете в виду, что у вас есть данные, представляющие собой список из двух элементов?Например:

my $element = [ '0', 'string' ];

Я думаю, что Пример 1 в документации («где ключ и значение хранятся отдельно») применим здесь - вы хотите отсортировать ссылки, а не сами значения.Поэтому попробуйте объявить с помощью elements => "Any", а затем настройте метод сортировки так, чтобы он соответствовал:

(я ошибся, похоже, elements => [Array => 0] правильно, так как это просто старые отсортированные массивы-ссылки.

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Array => 0],
                             );

sub byNumOrStr
{
    my ( $val1, $val2 ) = @_;

    my $result = 
        $val1->[0] <=> $val2->[0]  # the 0th element is a number
                    ||
        $val1->[1] cmp $val2->[1]; # the 1st element is a string

    # The docs say "this should return a true value if $key1 is smaller than $key2 and a false value otherwise."
    return $result == -1;
}

PS. Как обсуждалось в Вторичный порядок в Heap :: Simple , функция сравнения в Heap :: Simple не хочет возвращаемого значения -1, 0 или1, а точнее true или false. Вам необходимо преобразовать результат сравнения, прежде чем вернуться из функции.

0 голосов
/ 30 июня 2010

Что ж, вполне вероятно, что либо $a, либо $b передается в виде строки.Попробуйте распечатать эти переменные после назначения.

Из того, что я вижу из документации, когда вы передаете elements => [ Array => 0 ], если 0-й элемент в массиве не является массивом, вы будете сравнивать только значения в первомслот массива.

[Array => $index]
Указывает, что элементы являются ссылками на массив с ключом в индексе $ index.Таким образом, теперь элемент может быть не только ключом, но и связанными данными.

Это означает, что если 2,55 находится в массиве, как [2.55, ...], то это то, что передаетсяв виде $a или $b.

Запись elements сообщает H::S, как вы хотите получить ключ.Для совершенно общего способа написано, что вы можете передать [Function => $code_ref_for_key].Вы можете сделать это так:

sub first_two_slots {my $ array_ref = shift;return [@ $ array_ref [0,1]];}

И затем с указанным порядком он передаст этот массив в ваш заказ и укажет

my $heap = Heap::Simple->new( order     => \&byNumOrStr,
                              elements  => [Function => \&first_two_slots]
                             );

Исходный комментарий, оставленный на месте: (Это не имеет отношения к тому, как Heap::Simple вызывает вызов).

, если byNumOrStr вызывается из sort НЕ назначать $a и $b в нем.Эти значения установлены sort.Если что-то приходит в @_, это, вероятно, не то, что вы хотите.

...