- Версия AutoIt
- 3.3.14.0
- Версия
- 3.3.14.0
Решил поделитьсяю
Есть массив, в нем есть строки с "плохими" элементами их надобно найти и изничтожить, а теперь вопрос к знатокам, как сделать это быстро? Был предложен вот такой код, который, вполне надежный
но меня интересовал вопрос как это сделать с помощью _ArrayFindAll и _ArrayDelete
В процессе изучения выяснилось, что функция _ArrayFindAll , несколько кривовата по отношения к _ArrayDelete.
ArrayFindAll выдает одномерный массив со списком найденных строк где находится "плохой" элемент, эти номера строк (вот тут внимание) перечисляются, начиная с 0го элемента выдаваемого одномерного массива. А ArrayDelete (как выяснилось из английской справки) в качестве параметра понимает список-массив, где 0-м элементом идёт счётчик, другими словами Ubound этого массива, а далее, начиная с первого элемента перечисляются строки с найденными "плохими" элементами.
От какого лешего разрабы Array не состыковали их между собой, неясно. Ещё бы русскую справку по _ArrayDelete неплохо поправить.
и вот такой костыль пришлось дописать, чтобы эти функции заработали
еще интересный вариант с преобразованием найденного одномерного массива с плохими элементами в строку c последующим ее скармливанием _ArrayDelete
Есть массив, в нем есть строки с "плохими" элементами их надобно найти и изничтожить, а теперь вопрос к знатокам, как сделать это быстро? Был предложен вот такой код, который, вполне надежный
Код:
Func SearchAndDeleteFromArray($aArray, $sSearchText)
Local $iCount = UBound($aArray) - 1 ;определяем количество элементов в массиве
For $i = $iCount To 0 Step -1 ; проходимся по массиву в обратном порядке, чтобы не изменять индексы элементов
If StringInStr($aArray[$i], $sSearchText) Then ; если текущая строка содержит заданный текст
_ArrayDelete($aArray, $i) ; удаляем эту строку из массива
EndIf
Next
Return $aArray ; возвращаем измененный массив
EndFunc
но меня интересовал вопрос как это сделать с помощью _ArrayFindAll и _ArrayDelete
В процессе изучения выяснилось, что функция _ArrayFindAll , несколько кривовата по отношения к _ArrayDelete.
ArrayFindAll выдает одномерный массив со списком найденных строк где находится "плохой" элемент, эти номера строк (вот тут внимание) перечисляются, начиная с 0го элемента выдаваемого одномерного массива. А ArrayDelete (как выяснилось из английской справки) в качестве параметра понимает список-массив, где 0-м элементом идёт счётчик, другими словами Ubound этого массива, а далее, начиная с первого элемента перечисляются строки с найденными "плохими" элементами.
От какого лешего разрабы Array не состыковали их между собой, неясно. Ещё бы русскую справку по _ArrayDelete неплохо поправить.
Сообщение автоматически объединено:
и вот такой костыль пришлось дописать, чтобы эти функции заработали
Код:
$search=_ArrayFindAll($aArray,'Плохой элемент',0,0,0,0,4) ; ищем "плохие" элементы, 4 номер столбца в $aArray, массива в котором ищем и удаляем "плохой" элемент , на выходе получаем одномерный массив, который пока нельзя использовать в качестве параметра в _ArrayDelete
$ss=UBound($search)
Dim $searchwithcount[$ss+1] ; объявляем новый правильный одномерный массив
For $b=0 to UBound($search)-1
$searchwithcount[$b+1]=$search[$b] ;сдвигаем элементы неправильного массива на строку вниз, чтобы в 0-ю вставить нужный счетчик
Next
$searchwithcount[0]=$ss ;вставляем счетчик
_ArrayDelete ($aArray,$searchwithcount) ; теперь удаляем список строк с "плохими" элементами, но уже используем правильный одномерный массив с счетчиком в 0м элементе списка
_ArrayDisplay ($aArray) ;смотрим, что получилосьj
Сообщение автоматически объединено:
еще интересный вариант с преобразованием найденного одномерного массива с плохими элементами в строку c последующим ее скармливанием _ArrayDelete
Код:
local $aArray[6] = [1,2,3,2,5,2]
$aDel = _ArrayFindAll($aArray , 2)
_ArrayDelete($aArray , _ArrayToString($aDel , ";"))
_ArrayDisplay($aArray)
Последнее редактирование: