PowerShell - Перебор массивов

Ответить
Аватара пользователя
c4uran

PowerShell - Перебор массивов

Сообщение c4uran »

Вроде простая задача но никак не могу найти достаточно лаконичного решения



Есть два массива



При переборе первого массива, если его значение совпадает с любым из значений второго массива, выполняется действие



наверное решений много, буду признателен если поделитесь разными способами
Аватара пользователя
mwz

Re: PowerShell - Перебор массивов

Сообщение mwz »

c4uran, в общих чертах — пара алгоритмов, чисто для понимания:



Тупой способ — прочитать первое значение первого массива, а затем сравнивать его со значениями массива методом полного перебора этого второго. Если при каком-то из сравнений совпадение есть — выполнить действие и перейти к следующему элементу первого массива прервав сравнение текущего, если же совпадения нет — по исчерпании второго массива перейти ко следующему элементу первого массива и повторить.



Метод очень нерационален: время исполнения зависит от количества элементов массивов квадратично.



Более интеллектуально (время поиска зависит от количества элементов почти линейно) — из второго массива создать вспомогательный, упорядочив в нем элементы по возрастанию — и далее сравнивать методом половинного деления вспомогательного массива: если элемент первого, соответствующий [примерно] среднему элементу второго, меньше — то на следующем шаге брать середину верхней половины вспомогательного, если больше — середину нижней половины, и т.д., каждый раз отсекая уже проанализированные ненужные половинки. При совпадении же — выполнить действие и перейти к следующему элементу первого массива, прервав сравнение текущего.



Или проиндексировав второй массив — что по времени поиска даст примерно одно и то же.



Ох, сейчас корифеи бить будут...
Аватара пользователя
Kazun

Re: PowerShell - Перебор массивов

Сообщение Kazun »

Код:

Код: Выделить всё

$a = 1,2,3
$b = 3,4,5
Compare-Object $a $b -IncludeEqual -ExcludeDifferent
InputObject SideIndicator
----------- -------------
          3 ==
$r = Compare-Object $a $b -IncludeEqual -ExcludeDifferent
if($r) {
    "Код"
}
Аватара пользователя
Busla

Re: PowerShell - Перебор массивов

Сообщение Busla »

Цитата mwz:



Метод очень нерационален
PowerShell - Перебор массивов




спорно:

Медленнее по сравнению с копированием массива, сортировкой и последующим поиском он станет на довольно большом количестве элементов, а там может ещё и памяти не хватить.
Аватара пользователя
Iska

Re: PowerShell - Перебор массивов

Сообщение Iska »

Busla, это всегда так: выбор наиболее эффективного метода зачастую зависит от нашего знания о деталях реализации конкретных сущностей, над которыми мы планируем производить ту или иную операцию.
Аватара пользователя
Iska

Re: PowerShell - Перебор массивов

Сообщение Iska »

Как я понимаю, это "тупой" способ:





Код:

Код: Выделить всё

$arr1 | % { if ($_ -in $arr2) { $_ } }

А можно пример более интеллектуального?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»