高分求条件代码?(200分)

  • 主题发起人 主题发起人 optn3
  • 开始时间 开始时间
O

optn3

Unregistered / Unconfirmed
GUEST, unregistred user!
求算法?
利用条件删除MEMO内容,如果设定条件是0-3=01 02 03 04 05 //注,这5个数允许包含有0-3个,不符合条件的删除。
MEMO中内容如下。
01 02 03 04 05 07
01 02 03 04 05 08
01 02 03 04 06 07
01 02 03 04 06 08
01 02 03 04 07 08
01 02 03 05 06 07
01 02 03 05 06 08
01 02 03 05 07 08
01 02 03 06 07 08 //这一行不符合条0-3= 01 02 03 04 05,就要删除。
01 02 04 05 06 07
01 02 04 05 06 08
01 02 04 05 07 08
01 02 04 06 07 08
01 02 05 06 07 08
01 03 04 05 06 07
01 03 04 05 06 08
01 03 04 05 07 08
01 03 04 06 07 08
01 03 05 06 07 08
01 04 05 06 07 08
02 03 04 05 06 07
02 03 04 05 06 08
02 03 04 05 07 08
02 03 04 06 07 08
02 03 05 06 07 08
02 04 05 06 07 08
03 04 05 06 07 08
 
不解,楼主那条件究竟啥意思
按偶理解,那行根本就符合
 
const
cmpstr = '01 02 03 04 05';
var
I: Integer;
begin
for I := Memo1.Lines.Count - 1 downto 0 do
if Copy(Memo1.Lines, 1, Length(cmpstr)) <> cmpstr then
Memo1.Lines.Delete(I);
end;
 
他应该是說至少满足4个数字吧。
那条只有3个。
 
写个比较算法就行了,memo1.lines.strings[index]取出来比较
 
要个算法才行,我要不断调用,速度一定要快。
 
首先要满足条0-3个。
 
const test: array[0..4] of string = ('01','02','03','04','05'); //4
var
i,j: integer;
value,s: string;
count: integer;
begin
for i := memo1.Lines.Count -1 downto 0 do
begin
count := 0;
value := memo1.Lines.Strings;
while trim(value) <> '' do
begin
s := leftstr(value,2);
value := rightstr(value, length(value)-3);
for j := 0 to 4 do
begin
if s = test[j] then inc(count);
end;
end;
if count < 4 then memo1.Lines.Delete(i);
end;
end;
 
to andrew57:
const test: array[0..4] of string = ('01','02','03','04','05'); //4
test不能确定有多少个,长度是随机的,如果我要将test 设定为动态数组。怎样做?
 
test有可以是5,也有可能是20个,不定
 
先把test循环一遍放进一个Tstrings里面,再循环你的数据集,并且把每笔数据都放进另一个Tstrings里面,通过比较这两个Tstrings内容,找出你不要的
 
1、现在有些人连国语都说不好...
2、请问 01 02 03 06 07 08 包含“01 02 03 04 05”是几个?是不是 3 个?符不符合 0-3 个的条件?如果符合为什么要删除?更恐怖的是下面接着就有人开始写代码了。
3、一场轰轰烈烈的全民白痴运动又要开始了...
 
to vvyang
意思就是这个,andrew57代码可以就是速度慢,有没有快。
 
To optn3:
我可以给您很快的代码,可是我就是不明白是符合条件的删除还是不符合条件的删除,您不觉得您说的话前后矛盾么?!
 
To 楼主:
1、您对中文表达似乎很不擅长,我服了...
2、要想提高速度,要注意几件事情:
(1)尽量不要用 TMemo 提供的属性和方法。Delphi 控件的执行效率是很低的,看似简洁的属性和方法,其实背后进行了 N 多的操作。
(2)Memo 在删除行的时候,注意用 Lines.BeginUpdate 进行锁定,否则会因为刷新浪费很多时间。
(3)尽量减少字符串的合并和赋值操作。字符串进行比较时,尽量用指针,因为指针的移动速度是很快的(就是一个加法操作)。
(4)测试了一下您给的例子,用我的方法耗时 0 ms,andrew57 的方法耗时 10 ms。如果频繁操作,这个差距还会加大。用循环向 Memo 中填入 10000 条“06 06 01 02 03 04”(之所以用这组数据是因为它不会引起 Delete 操作,便于比较算法速度),我的方法耗时 125 ms,andrew57 的方法耗时 297 ms。
4、程序如下,虽然比较长,但是速度应该过得去。另外这个程序对每行有几个空格无限制,对比较字符串(test)的长度也无限制:
var
sCmp: string;
pCmp, pMem, p: PChar;
pDel, pCur: PInteger;
rownum, size, row, cnt, i: Integer;
rtn: Boolean;
begin
sCmp := '0102030405';//test 字符串,您可以随意变化这些数字
pCmp := PChar(sCmp);
rownum := Memo1.Lines.Count;
size := rownum*20 + 1;
pMem := AllocMem(size);
SendMessage(Memo1.Handle, WM_GETTEXT, size, Integer(pMem));
GetMem(pDel, rownum*4);
pCur := pDel;
row := 0;
cnt := 0;
i := 0;
rtn := False;
while pMem <> #0 do
begin
if pMem = #32 then
begin
Inc(i);
if rtn then rtn := False;
end
else if (pMem = #13) or (pMem = #10) then
begin
if not rtn then
begin
if cnt < 4 then
begin
pCur^ := row;
Inc(pCur, 1);
end;
rtn := True;
cnt := 0;
Inc(row);
end;
Inc(i);
end
else begin
if cnt < 4 then
begin
p := pCmp;
while p^ <> #0 do
begin
if CompareMem(@pMem, p, 2) then
begin
Inc(cnt);
Break;
end;
Inc(p, 2)
end;
end;
Inc(i, 2);
if rtn then rtn := False;
end;
end;
FreeMem(pMem);
Memo1.Lines.BeginUpdate;
while pCur <> pDel do
begin
Dec(pCur, 1);
Memo1.Lines.Delete(pCur^);
end;
FreeMem(pDel);
Memo1.Lines.EndUpdate;
end;
5、能用就给个话,不能用也说一声,别当没看见。
 
to vvyang
你的一翻话,真的很有教导作用,以前没用过指针,总是在MEMO中字符比较,太费时了,
谢谢,程序不错,快多啦。
如果将MEMO定义为类TStings的话更快。
 
“如果将MEMO定义为类TStings的话更快”:这话没错...
能用就结帖吧...
一点忠告:
1、涉及到字符串的只读操作,尽量用指针,Delphi 的类确实封装的很好,但是效率却非常低下...
2、自己可以写的代码尽量自己写,因为那样可以进行特殊的优化...
3、追求速度是人类的天性,优化代码绝不是一件愚蠢的事...
 
多人接受答案了。
 
分配不均,鄙视楼主...
 

Similar threads

后退
顶部