Автор Тема: Массивы  (Прочитано 5457 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« : 09 Ноября 2005, 14:08:07 »
Есть 2 массива, вних разные значения, но иногда бывают одинаковые.

Каким образом я могу вырезать из второго массива все записи, которые встречаются в первом? И также нежно создать 3 массив, куда бы вписывались номера удаленных элементов...?
Космическая игрушка

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Массивы
« Ответ #1 : 09 Ноября 2005, 14:27:41 »
my $re = "(?:" . join ("|",@ary1) . ")";
my @ary3 = grep !/^$re$/o,@ary2

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« Ответ #2 : 09 Ноября 2005, 14:37:21 »
То что надо! Спасибо...
Только вот вопрс, как изменить код для:

У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие записи в др. массивах (SecondPhone, SecondWork)

P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
Космическая игрушка

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Массивы
« Ответ #3 : 09 Ноября 2005, 14:38:49 »
arto
красиво, но ИМХО медленно...

Error202
map {for my $el(@arr1){push @arr3, $_ if $_==$el}}@arr2;
And no religion too...

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« Ответ #4 : 09 Ноября 2005, 14:47:08 »
Что-то у меня эта штука работает неверно... :(
Выдает кучу одинаковых результатов...
Космическая игрушка

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Массивы
« Ответ #5 : 09 Ноября 2005, 14:54:46 »
Error202
пардон... видимо не правильно понял задачу...
map {my $i=0;for my $el(@arr1){$i=1, $_ if $_==$el} push @arr3, $_ if !$i}@arr2;


P.S. придет Влад... и всем нос утрет... :)
And no religion too...

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« Ответ #6 : 09 Ноября 2005, 15:01:09 »
Да работает... Спасибо...
...
Возвращаясь к моему 2-му посту:

У меня 1+(1+2) массива...
Т.е. Есть массив FirstNames и массивы SecondNames, SecondPhone, SecondWork...
Как сделать как в примере выше, но также удалились бы соответствующие (по номеру, точнее индексу) записи в др. массивах (SecondPhone, SecondWork)

P.S. По примеру Выше: @ary1 - FirstNames, @ary2 - SecondNames
Все массивы SecondXXX - имеют равное кол-во записей...
Космическая игрушка

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Массивы
« Ответ #7 : 09 Ноября 2005, 15:22:09 »
# perl -MBenchmark -de0
  DB<1> @a = qw(1 3 5 7 9)
  DB<2> @b = qw(a d f 5 h 7 r 1 l 3 p)
  DB<3> $re = "(?:" . join ("|",@a) . ")"
  DB<4> timethese (1_000_000,{\'A\' => sub { my @c = grep !/^$re$/o,@b; },\'B\' => sub { map { my $i = 0; for my $el (@a){$i = 1, $_ if $_ eq $el} push @c, $_ if !$i} @b;} })
Benchmark: timing 1000000 iterations of A, B...
         A: 35 wallclock secs (30.43 usr +  0.10 sys = 30.53 CPU) @ 32754.67/s (n=1000000)
         B: 85 wallclock secs (74.15 usr +  1.46 sys = 75.61 CPU) @ 13225.76/s (n=1000000)

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Массивы
« Ответ #8 : 09 Ноября 2005, 16:18:35 »
my $i = -1;
my $re = ...
my @ary3 = grep { $i++; if (m|^$re$|) { splice @secary1,$i--,1; 0 } else { 1 } } @ary2;

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« Ответ #9 : 09 Ноября 2005, 16:22:55 »
Спасибо!
Космическая игрушка

Оффлайн Error202

  • Бесстрашный
  • Ветеран
  • *****
  • Сообщений: 540
  • +1/-0
  • 2
    • Просмотр профиля
    • http://www.tender-plus.ru
Массивы
« Ответ #10 : 09 Ноября 2005, 16:26:15 »
А можно ли как-нть быстро объединить 3 массива таким образом:
[А1 А2 А3 А4 А5]
[Б1 Б2 Б3 Б4 Б5]
[В1 В2 В3 В4 В5]

объединить в один вида:
[А1 Б1 В1 А2 Б2 В2 и т.д.] ?
Космическая игрушка

Оффлайн arto

  • Ветеран
  • *****
  • Сообщений: 699
  • +0/-0
  • 2
    • Просмотр профиля
Массивы
« Ответ #11 : 09 Ноября 2005, 16:27:36 »
or

my $i = 0;
my $re = ...
my @ary3 = grep { if (m|^$re$|) { splice @secary1,$i,1; 0 } else { ++$i } } @ary2;

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Массивы
« Ответ #12 : 09 Ноября 2005, 17:20:04 »
arto
хммм.... твоя правда.. :)
And no religion too...

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Массивы
« Ответ #13 : 09 Ноября 2005, 17:23:13 »
Цитировать
Error202:
А можно ли как-нть быстро объединить 3 массива таким образом:

  DB<1> @a = (A1, A2)

  DB<2> @b = (B1, B2)

  DB<3> @a = sort { (split//,$a)[1] <=> (split//,$b)[1] } (@a, @b)

  DB<4> p @a
A1B1A2B2
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28