Что нового

Как почистить массив (удалить незаполненные элементы)?

Suppir

Продвинутый
Сообщения
967
Репутация
62
Допустим, я создал массив $array[10000][3]
и при этом заполнил только 3 тысячи элементов по первой размерности.
Также в этих 3-х тысячах есть незаполненные (пропущенные) элементы. Каким образом можно "почистить" массив, удалив незаполненные элементы? Желательно, не меняя имя массива.



Интересует алгоритм, работающий с максимальной скоростью (элементов очень много).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Самый быстрый способ в даной ситуации, последовательно скопировать все необходимые елементы в новый массив, а затем присвоить ему нужное имя.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Да, наверное, это самый лучший способ. Жалко, что нет готовой функции.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Код:
Dim $Temp[UBound($array)][UBound($array, 2)]

$Index = 0
For $i = 0 To UBound($array) - 1
	If $array[$i][0] Then
		For $j = 0 To UBound($array, 2) - 1
			$Temp[$Index][$j] = $array[$i][$j]
		Next
		$Index += 1
	EndIf
Next

If $Index Then
	ReDim $Temp[$Index][UBound($Temp, 2)]
Else
	$Temp = 0
EndIf

$array = $Temp
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Спасибо, работает идеально! :laugh:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
OffTopic:
Yashied
Просто и изящно! :thumbs_up:
 

shm_alex

Новичок
Сообщения
34
Репутация
4
Yashied сказал(а):
У меня вопрос, А как освободить память из под $array.
Redim высвобождаеит ненужную память?
(что-то типа следующего)
Код:
$SS=$array
$array = $Temp
Redim $SS[0]

или она(память) освободится как то сама?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
shm_alex сказал(а):
А как освободить память из под $array?
В AutoIt переменные не привязаны к какому-либо типу, и память под все переменные выделяется/освобождается динамически. Поэтому, если массив ооооочень большой, то для освобождения занимаемой им памяти достаточно присвоить переменной, связанной с этим массивом, какое-нибудь значение, например 0. А так, можешь не забивать этим голову.

Код:
$array = 0


Более того, память под все локальные переменные, те, что объявлены внутри функции, будет освобождена автоматически при завершении этой функции.
 
  • Like
Реакции: Norm
Верх