如何删除数组中的N个指定元素?(9分)

  • 主题发起人 主题发起人 shmily0616
  • 开始时间 开始时间
S

shmily0616

Unregistered / Unconfirmed
GUEST, unregistred user!
N可能为0可能为1可能为n,要删除的元素可能连着可能不连着
想得到删除这些元素后的新数组

要删除的元素我知道,可以组成一个数组,也就是从原数组里删除这个数组

具体代码怎么写效率比较高?
 
1、头一次听过说从一个数组里删除另外一个数组,真新鲜!
阁下知道有一种数据结构叫链表么?
2、如果你实在要用数组,也有办法,而且不麻烦。因为您即没说原来的数组是动态的还是静态的,也没说您是知道要删除数据的标号还是内容,所以建议您以后提问题说明白一点,谢谢!
var
dynOld, dynNew: array of Integer;
buf, p: PInteger;//指针的类型要与 dynOld 的元素一样
i, cnt: Integer;
begin
...//你原来的动态数组 dynOld 内容假设已知
GetMem(buf, SizeOf(dynOld)*Length(dynOld));
p := buf;
cnt := 0;
for i := 0 to Length(dynOld) - 1 do
if 元素符合条件 then
begin
p^ := dynOld;
Inc(p);
Inc(cnt);
end;
SetLength(dynNew, Length(dynOld) - cnt);
Move(buf^, PChar(dynNew)^, SizeOf(dynNew)*Length(dynNew));
FreeMem(buf);
...//dynNew 中存储了过滤后的数据
end;
3、当然,中间可以不用 buf 倒一次,直接把符合条件的 dynOld 元素赋给 dynNew 就行了,但是后来还要把 dynNew 的长度用 SetLength 重新设定一下,我不知道这样会不会导致数据丢失,所以没用这种方法:
var
dynOld, dynNew: array of Integer;
i, cnt: Integer;
begin
...//你原来的动态数组 dynOld 内容假设已知
SetLength(dynNew, Length(dynOld));
cnt := 0;
for i := 0 to Length(dynOld) - 1 do
if 元素符合条件 then
begin
dynNew[cnt] := dynOld;
Inc(cnt);
end;
SetLength(dynNew, Length(dynOld) - cnt);
...//dynNew 中存储了过滤后的数据
end;
 
接受答案了.
 
后退
顶部