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));