2012-02-07 2 views
3

Можно создать дубликат:
Iterating hash based on the insertion order?Как индексировать хэш

им пытаются получить пятый элемент этого хэша

%cds = ("Dr. Hook"   => "Sylvias Mother", 
     "Rod Stewart" => "Maggie May", 
     "Andrea Bocelli" => "Romanza", 
     "Kenny Rogers" => "For the good times", 
     "Bee Gees"  => "One night only", 
     "Bonnie Tyler" => "Hide your heart"); 

В этом случае, было бы «bee Gees», «Только одна ночь»

но когда им пытаются реализовать этот код

while (($key, $value) = each %cds) { 
    print "$key $value\n"; 
} 

это печатает все элементы, но не для того,

Как это возможно, и как я могу получить пятый элемент?

+5

Ответ: «Не используйте хэш». См. Полезные ответы: http://stackoverflow.com/questions/1558625/how-can-i-maintain-the-order-of-keys-i-add-to-a-perl-hash – Alex

+0

Я не знаю если perl имеет любую коллекцию, такую ​​как LinkedHashMap в Java. Если да, то проблема решена. Кстати, почему вас волнует порядок Карты? – George

ответ

5

Хеши не хранятся ни в каком (удобном для пользователя) порядке. Если вам нужно получить элементы по числовому индексу, вы не должны использовать хэш. Вы можете сортировать коллекцию ключей (по-прежнему не получается «порядок вставки»).

2
@cds = (["Dr. Hook",  "Sylvias Mother"], 
     ["Rod Stewart", "Maggie May"], 
     ["Andrea Bocelli", "Romanza"], 
     ["Kenny Rogers", "For the good times"], 
     ["Bee Gees",  "One night only"], 
     ["Bonnie Tyler", "Hide your heart"], 
); 

Это массив массивов. $ cd [4] [0] - художник, $ cd [4] [1] - это название.

5

Один из вариантов - сохранить ваш хэш как есть (неупорядоченную коллекцию) и увеличить с помощью массива ключей (упорядоченная последовательность). Затем сверните по массиву (в порядке ввода) и используйте хеш для поиска соответствующих значений.

Другим вариант заключается в загрузке упорядоченной реализации хеша из CPAN: Tie::Hash::Indexed

Надеется, что это помогает :-)

1

Ключа находится в фразе «но не в порядке». Хэш не является упорядоченной коллекцией. Если вы хотите их по порядку, используйте упорядоченную коллекцию, т. Е. Массив. Полный рабочий пример:

#!/usr/bin/perl 

use strict; 
use warnings; 

my @cds = (
    [ 'Dr. Hook'  => 'Sylvias Mother'  ], 
    [ 'Rod Stewart' => 'Maggie May'   ], 
    [ 'Andrea Bocelli' => 'Romanza'   ], 
    [ 'Kenny Rogers' => 'For the good times' ], 
    [ 'Bee Gees'  => 'One night only'  ], 
    [ 'Bonnie Tyler' => 'Hide your heart' ], 
); 

for my $cd (@cds) { 
    my ($key, $value) = @$cd; 

    print "$key $value\n"; 
} 

my $fifth_element = $cds[4]; 

print "Fifth element is @$fifth_element\n"; 
Смежные вопросы