Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Количество одинаковых элементов массива 
:(
    Опции темы
Гость_Игорь
Дата 3.10.2005, 10:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте,
никак не могу разобраться с этой задачей:

необходимо посчитать количество одинаковых элементов в массиве.
те есть массив, например:
@dot=qw(1 2 3 6 7 2 1 1 2 6 1);

необходимо вывести такую статистику:
единиц - 4 штуки,
двоек - 3 штуки и тп

при этом надо учесть, что сам массив произвольного размера и количество повторяющихся элементов неизвестно.

Единственно что пришло в голову - скопировать массив и сравнивать каждый элемент массива со всеми элементами его копии. Но этот вариант крайне ресурсоёмкий. Наверняка есть какое-то более простое решение.

Специалисты, помогите пожалуйста.
Спасибо большое заранее.



  Вверх
Bolt
Дата 3.10.2005, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 21.2.2005

Репутация: нет
Всего: нет



это делается с помощью хэша
PM WWW ICQ   Вверх
korob2001
Дата 3.10.2005, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Код

#!/usr/bin/perl -w
use strict;
my @dot=qw(1 2 3 6 7 2 1 1 2 6 1);
my %res = ();
grep { $res{ $_ }++ } (@dot);
foreach ( sort { $a <=> $b } keys %res )
{
          print "$_ - $res{ $_ } øòóê.\n";
}

Проходим по всему массиву, каждый элемент устанавливаем как ключь хеша, а значение инкрементируем. Так как хеш не может содержать одинаковые ключи, то если данный ключь был установлен ранее, значит просто инкрементируем его значение. В итоге получаем хеш, где все уникальные елементы - это ключи, а их значения - кол-во этих элементов в массиве. Кстати, этого же результата можно добиться и не используя grep, а с помощью любого цикла. Вот тот же пример, только с использованием цикла while:
Код

#!/usr/bin/perl -w
use strict;
my @dot=qw(1 2 3 6 7 2 1 1 2 6 1);
my(%res, $element) = ();

$res{ $element }++ while ( $element = shift @dot );

foreach my $key ( sort { $a <=> $b } keys %res )
{
          print "$key - $res{ $key } øòóê.\n";
}

Здесь стоит учитывать один момент, после окончания цикла while, массив будет пуст. Этот способ хорошо применять в том случае, если массив больше не нужен и он очень большой.

Это сообщение отредактировал(а) korob2001 - 3.10.2005, 11:15


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Sadok
Дата 3.10.2005, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Код
use strict;
my @dot=qw(1 2 3 6 7 2 1 1 2 6 1);
my %seen = ();
my $item;
foreach $item (@dot) {
        $seen{$item}++ ;
      }

После чего в хеше %seen имеем в качестве ключей элементы массива @dot, в качестве значений - их количество
PM   Вверх
Guest
Дата 4.10.2005, 15:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0919 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.