Вверх ↑
Ответов: 1926
Рейтинг: 172
#1: 2018-01-01 21:23:01 ЛС | профиль | цитата
Galkov, отлично! Я, правда, по-другому собирался сделать, вот так:

procedure THIArrayFilterRepeats._work_doFilter1;
var
i, j, v, L,H,C: integer;
Repeats: boolean;
begin
ArrIn := ReadArray(_data_Array);
if (ArrIn = nil) or (ArrIn._Count = 0) then exit;

SetLength(IntArray, 0);

for i := 0 to ArrIn._Count - 1 do
begin
v := ToInteger(GetArrayVal(i));

if Length(IntArray)=0 then
begin
SetLength(IntArray, 1);
IntArray[0] := v;
_hi_onEvent(_event_onFilter, v);
end else
if v<IntArray[Low(IntArray)] then
begin
SetLength(IntArray, Length(IntArray) + 1);
MoveMemory(@IntArray[1],@IntArray[0],(Length(IntArray) - 1)*Sizeof(Integer));
IntArray[0] := v;
_hi_onEvent(_event_onFilter, v);
end else
if v>IntArray[High(IntArray)] then
begin
SetLength(IntArray, Length(IntArray) + 1);
IntArray[High(IntArray)] := v;
_hi_onEvent(_event_onFilter, v);
end else
begin
Repeats := false;
L := 0;
H := High(IntArray);
while L <= H do begin
j := (L + H) shr 1;
C := IntArray[j] - v;
if C < 0 then L := j + 1
else begin
H := j - 1;
if C = 0 then begin
Repeats := true;
L := j;
end;
end;
end;
j := L;
if not Repeats then begin
SetLength(IntArray, Length(IntArray) + 1);
MoveMemory(@IntArray[j+1],@IntArray[j],(Length(IntArray)-1-j)*Sizeof(Integer));
IntArray[j] := v;
_hi_onEvent(_event_onFilter, v);
end;
end;

end;
_hi_CreateEvent_(_Data, @_event_onEndFilter);
end;

Но это медленнее, чем Ваш вариант.

Я только одного у Вас не понял: зачем там локальная переменная P создаётся, если есть PArray?

P: PList;
P := PList(PArray);
P.Clear;

Можно, навреное, сразу с PArray работать:

PList(PArray).Insert(j, pointer(v));
?
карма: 9
0