![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Гость_Игорь |
|
|||
Unregistered |
Здравствуйте,
никак не могу разобраться с этой задачей: необходимо посчитать количество одинаковых элементов в массиве. те есть массив, например: @dot=qw(1 2 3 6 7 2 1 1 2 6 1); необходимо вывести такую статистику: единиц - 4 штуки, двоек - 3 штуки и тп при этом надо учесть, что сам массив произвольного размера и количество повторяющихся элементов неизвестно. Единственно что пришло в голову - скопировать массив и сравнивать каждый элемент массива со всеми элементами его копии. Но этот вариант крайне ресурсоёмкий. Наверняка есть какое-то более простое решение. Специалисты, помогите пожалуйста. Спасибо большое заранее. |
|||
|
||||
Bolt |
|
|||
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 21.2.2005 Репутация: нет Всего: нет |
это делается с помощью хэша
|
|||
|
||||
korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Проходим по всему массиву, каждый элемент устанавливаем как ключь хеша, а значение инкрементируем. Так как хеш не может содержать одинаковые ключи, то если данный ключь был установлен ранее, значит просто инкрементируем его значение. В итоге получаем хеш, где все уникальные елементы - это ключи, а их значения - кол-во этих элементов в массиве. Кстати, этого же результата можно добиться и не используя grep, а с помощью любого цикла. Вот тот же пример, только с использованием цикла while:
Здесь стоит учитывать один момент, после окончания цикла while, массив будет пуст. Этот способ хорошо применять в том случае, если массив больше не нужен и он очень большой. Это сообщение отредактировал(а) korob2001 - 3.10.2005, 11:15 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
Sadok |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 2.11.2004 Репутация: 1 Всего: 2 |
После чего в хеше %seen имеем в качестве ключей элементы массива @dot, в качестве значений - их количество |
|||
|
||||
Guest |
|
|||
Unregistered |
Many thanx всем,
всё работает :-) а вот ещё один вариант подсказали: my @dot=qw(1 2 3 6 7 2 1 1 2 6 1); my %hash; $hash{$_}++ for @dot; print "$_ => $hash{$_}\n" for sort keys %hash; 2 korob2001: спасибо за подробное объяснение, именно они и помогают изучать perl |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |