Delphi 如何比较TAdvStringGrid的4列值并标记它们?

Delphi 如何比较TAdvStringGrid的4列值并标记它们?,delphi,delphi-2007,Delphi,Delphi 2007,如果我有colA,ColB,Colc,ColD,TAdvStringGrid中每列有1000行。我想检查TAdvStringGrid的colA、ColB、Colc、ColD中1000行中的值的双重测量数 我在做一些事情,比如在第一次将ColA、ColB、ColC、ColD值读入多维数组时,在多维数组中循环每个元素,并与每个行元素TAdvStringGrid进行比较,当使用OnDrawcell函数发现相同时,我用颜色标记并显示行。 然而,这需要很多时间。有没有较短的方法。随着行数的不断增加。提前谢

如果我有colA,ColB,Colc,ColD,TAdvStringGrid中每列有1000行。我想检查TAdvStringGrid的colA、ColB、Colc、ColD中1000行中的值的双重测量数

我在做一些事情,比如在第一次将ColA、ColB、ColC、ColD值读入多维数组时,在多维数组中循环每个元素,并与每个行元素TAdvStringGrid进行比较,当使用OnDrawcell函数发现相同时,我用颜色标记并显示行。 然而,这需要很多时间。有没有较短的方法。随着行数的不断增加。提前谢谢你的回答


每一行是一个测量值,一个测量值由ColA、B、C、D中的4个值组成

List : array of array of double; 
SetLength (List,AdvStringGrid.RowCount,4);      
for i := 0 to AdvStringGrid.RowCount -1 do begin 
  j:=0; 
  List[i,j] := strtofloat(AdvStringGrid.Cells[4,i+1]); 
  List[i,j+1] := strtofloat(AdvStringGrid.Cells[5,i+1]); 
  List[i,j+2] := strtofloat(AdvStringGrid.Cells[8,i+1]); 
  List[i,j+3] := strtofloat(AdvStringGrid.Cells[9,i+1]); 
end;{for i} 

如何将每个元素与相邻元素进行比较,并标记重复元素???

我是否正确认为每一行都是一个测量值?那么四个值中有一个是测量值

首先,您不应该在循环中修改可视StringGrid。在最坏的情况下,StringGrid将失效,并在每次操作后再次绘制。 所以读取多维数组中的所有数据是很好的

为了消除双重性,我会对所有东西进行排序,然后比较相邻的两个。这是一种非常常见的模式

定义任意顺序,如ColA accending、ColB accending、ColC accending和ColD accending,并执行排序算法(如快速排序或合并排序)

完成所有排序后,您可以将数组从highes元素遍历到0,并检查两个相邻元素是否相同

如果要标记双值而不是删除它们,请考虑在复制时添加第五Culm作为值。

在所有的计算之后,我会搜索任何函数,比如
BeginUpdate()
Endupdate()
,以确保StringGrid只绘制一次

在调用
BeginUpdate()
Endupdate()

更新:您的代码可能如下所示:

var
 i:integer;
 sortedList: array of array of double;
begin
setlength(List, 1000, 5); // use a fifth row for marking doublicates, set this value to 0
// Fill List like you mentioned here
sortedList = YourSortAlgorithm(List); // sort your List here
for i := high(sortedList) downto 0 do
    begin
    // compare if entries are duplicates
    if sortedList[i,1] = sortedList[i-1,1] and sortedList[i,2] = sortedList[i-1,2] and sortedList[i,3] = sortedList[i-1,3] and sortedList[i,4] = sortedList[i-1,4] then
       begin
       sortedList[i-1,5] = 1; // 1 means duplicate, 0 means not duplicate
       end;
    end;
AdvStringGrid1.BeginUpdate;
// update your Stringgrid here
AdvStringGrid1.EndUpdate(); 
end;   
顺便说一下,我建议使用记录数组,而不是使用二维数组。 比如说,你的可乐是高度,可乐是长度,可乐是温度,寒冷是年龄,你可以这样定义一个记录

type
TMeasurement = record
   height: double;
   length: double;
   temperature: double;
   age: double;
   isBoolean: boolean;
end; 

var
  list: array of TMeasurement;
begin
//...
end;

是的,您是正确的,每一行是一个度量值,一个度量值由ColA、B、C、D中的4个值组成。列表:double数组的数组;SetLength(列表,AdvStringGrid.RowCount,4);对于i:=0到AdvStringGrid.RowCount-1,开始j:=0;List[i,j]:=strtofloat(AdvStringGrid.Cells[4,i+1]);列表[i,j+1]:=strtofloat(AdvStringGrid.Cells[5,i+1]);列表[i,j+2]:=strtofloat(AdvStringGrid.Cells[8,i+1]);列表[i,j+3]:=strtofloat(AdvStringGrid.Cells[9,i+1]);结束;{for i}如何将每个元素与相邻元素进行比较并标记重复项??