Что нового

[Массивы] двухмерный массив, удаление, добавление строк

RomchegChe

Новичок
Сообщения
37
Репутация
1
Здравствуйте, Уважаемые!
Работаю с двухмерным массивом, то есть таблицей. Необходимо по условию удалять строки, добавлять строки, сортировать по определенной колонке, искать первое значение.
Корректно ли вот так удалять строки из двухмерного массива?
Код:
For $n = UBound($Array) - 1 to 0 Step -1
 If $uslovie Then
_ArrayDelete($Array, $n)
 EndIf
Next

ведь при удалении размерноть меняется и получается проход от начала к концу нельзя использовать. По и при проходе от конца к началу у меня иногда массив становится некорректым
Далее мне нужно добавлять строки, но в двухмерный массив я могу их добавить только так
Код:
ReDim $massiv[UBound($massiv) + 1]

тут тоже вылазять ошибки после добавления

Ошибка - выход за границы массивва...
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Код:
$i = 1 ;Start (или UBound($Array) - 1)
Do
    If $uslovie Then
        _ArrayDelete($Array, $i)
    Else
        $i += 1 ; Или -=
    EndIf
Until ($i = UBound($Array)) ;Или 0

Хотя на мой взгляд лучше всего будет сделать так:
Обходишь с условием массив. Элементы, которые нужно удалить - очищаешь ("").
Ну а потом удаляешь пустые.
 
Автор
R

RomchegChe

Новичок
Сообщения
37
Репутация
1
щас посмотрел на тестовых данных, удаление при обратном обходе норм работает. Может косяк где то в другом.
А как очищать? в какую то ячейку записывать "" ? И как удалять пусиые? это снова обход делать?
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
RomchegChe
Что-то не нашёл той темы, где решался этот же вопрос, пишу повторно:
Функция _ArrayDelete фактически переписывает элементы, которые выше удаляемого элементв, сдвигая на одну ячейку вниз, потом обрезка массива на 1 элемент. Каждый такой вызов сопровождается многократным переписыванием массива. Не проще ли взамен удаляемых писать новые данные? Или иметь массив битых секторов ячеек и восстанавливать их при получении новых данных, которые заменят их? По крайней мере удаление таких ячеек будет за один проход. Напрмиер после 100 битых выполнить удаление.


Добавлено:
Сообщение автоматически объединено:

Код:
#include <Array.au3>
Local $a[1000]
For $i = 0 To 999
	$a[$i] = Random(1, 10, 1)
Next
_ArrayDisplay($a, UBound($a) & ' ячеек до удаления')

$idx = 0
For $i = 0 To UBound($a) - 1
	If $a[$i] <> 1 Then ; удаление ячеек, значение которых равно 1
		$a[$idx] = $a[$i]
		$idx += 1
	EndIf
Next
If $idx = 0 Then
	ReDim $a[1]
	$a[0] = ''
Else
	ReDim $a[$idx]
EndIf
_ArrayDisplay($a, UBound($a) & ' ячеек после удаления')


Оптимизировал, теперь перезапись начинается не от начала, а от позиции требующей изменения
Код:
#include <Array.au3>

; Создание тестового массива
Local $a[1000] = [999] ; массив на 1000 элементов, в первом элементе, индекс которого [0], находится число элементов
$DeleteItem = 1 ; число, ячейки с которым будут удалены из массива

For $i = 1 To 999
	$a[$i] = Random(1, 10, 1)
Next

; Начало операции удаления ячеек, значение которых равно 1
$n = 0
For $i = 1 To $a[0]
	If $a[$i] = $DeleteItem Then ; вычисляем индекс от которого выполнять перезапись массива
		$n = $i
		ExitLoop
	EndIf
Next

_ArrayDisplay($a, $a[0] & ' ячеек до удаления, ' & $n & ' - позиция начала перезаписи')

If $n Then ; Если найдено, то приступаем к удалению
	For $i = $n + 1 To $a[0] ; Начинаем от индекса следующего за индексом $n переписывать массив
		If $a[$i] <> $DeleteItem Then ; удаление ячеек, значение которых равно 1
			$a[$n] = $a[$i]
			$n += 1
		EndIf
	Next
	ReDim $a[$n]
	$a[0] = $n - 1
EndIf

_ArrayDisplay($a, $a[0] & ' ячеек после удаления')
 
Верх