![]() |
Выбор групп строк из массива по разделителю
Добрый день. Имеется массив строк
Код:
$mass1 = @(0,1,2,3,0,4,0,5,6) Задача: Выделить эти группы данных для дальнейшей работы в отдельный двумерный массив или хеш-таблицу В итоге должно получиться аналогично этой структуре Код:
$mass2 = @(@(1,2,3),@(4),@(5,6)) Пока только такая идея - использовать функцию для поиска индексов этого разделителя Код:
function findinarr ($mass, $value) { Код:
(findinarr $mass 0) Как-то неуклюже.. и затратно будет, при наличии большого кол-ва строк Есть какой-то "правильный" и оптимальный способ решения? |
Кривовато, но вроде работает:
Код:
$mass = @(0,1,2,3,0,4,0,5,6) |
Понятно, спасибо.
Была мысль собрать -join. А если там будет условно 100 000 строк... Могут быть проблемы с производительностью |
Может, так?
Код:
$mass2 = [System.Collections.ArrayList]@() Код:
PS C:\WINDOWS\system32> $mass2.GetType() |
Код:
$arr = @(0,1,2,3,0,4,0,5,6) |
Цитата:
|
Цитата:
Тем более, что поправить - не проблема же. Но там ещё есть другая проблема... при значительном увеличении количества элементов массива (точное число не назову, но на 10000 уже спотыкается :) ), метод с заменой регулярками попросту захлебнется от этого количества... А вот метод со списками, вполне быстрый... Цитата:
Цитата:
Цитата:
Да и просто озвучивание - ничего не показывает... важно только решение, но где оно? |
Цитата:
Цитата:
Код:
# тесты различных способов разделения массива по разделителю Изначально формируется один массив в 100000 элементов, причем на все варианты - результаты идентичны, но скорострельность отличается... |
+=, кстати - довольно коварная штука. По умолчанию массив в PS неизменяемый (immutable), поэтому при += создаётся новый массив. Если элементов много, то падение производительности после определённого кол-ва элементов становится очень большим.
Есть ArrayList, который изменяемый и в него можно именно добавлять элементы, а не пересоздавать массив каждый раз. https://adamtheautomator.com/powersh...ith_PowerShell |
Цитата:
У меня тут даже тест есть... Код:
$cnt = 30000 Хотя, почему бы не использовать, раз уж есть такой тип массивов... в любом случае, хоть и ненамного, но быстрее. |
Время: 23:54. |
Время: 23:54.
© OSzone.net 2001-