对TArray <myrectype>排序问题以获取大量数字

时间:2018-06-30 04:47:55

标签: arrays sorting delphi

当我在比较中有大量数字时,TArray.Sort<Mytype>不起作用的原因是什么?

我的代码如下(Delphiy Tokyo):

Interface

Type 
 RCInd = record
           Num              : Integer;
           Ger              : Integer;           
           Confirmed        : Boolean;
           Total            : Real;
   End;

   TArrInd = TArray<RCInd>;

   Procedure SortInd  (Var PArrayInd  : TArrInd);

Implementation  

Procedure SortInd  (Var PArrayInd  : TArrInd);    
begin
  TArray.Sort<RCInd>( PArrayInd,TComparer<RCInd>.Construct
                       ( function (Const Rec1, Rec2 : RCInd) : Integer 
                         begin
                           Result := - ( Trunc(Rec1.Total) - Trunc(Rec2.Total) );
                         end )
                       );
end;

......

当Rec1.Total和Rec2.Total的值在Integer限制之内时,此排序工作正常,但当值超过Integer限制时,BUT不起作用!它会在PArrayInd中生成一组未排序的数据。

这是怎么回事?

1 个答案:

答案 0 :(得分:9)

问题是溢出之一。实数值溢出整数类型。

compare函数用于返回负数以表示小于,正于。表示大于和零表示相等。使用算术是导致问题的原因,并导致溢出。而是使用比较运算符。

function(const Rec1, Rec2: RCInd): Integer
begin
  if Rec1.Total < Rec2.Total then
    Result := 1
  else if Rec1.Total > Rec2.Total then
    Result := -1
  else
    Result := 0;
end;

此问题的问题是尝试将实数值拟合为整数,但是即使您具有整数数据,也不应将算术用于比较函数。考虑表达式

Low(Integer) - 1

这导致溢出。通常,始终使用比较运算符来实现比较功能。