【发布时间】:2021-08-12 18:01:47
【问题描述】:
我正在尝试对一个充满分数和字符串的字符串网格进行排序,如下所示:
通过一个排序字符串列表,该列表按网格中的单个列排序,分别称为 SUB 1、SUB 2、FINAL、TOTAL(除 FINAL 外,所有这些列都有效),我在 FINAL 列中没有得到我需要的结果.
我试图让列按这样排序,例如:
24
20
12
5
DNF
EXE
WE
但我得到的是这个结果(我不想要的结果):
DNF
EXE
WE
24
20
12
5
我可以通过什么方式更改我的代码以按照我想要的方式对网格进行排序?
我的代码:
function Compare2(
List : TStringList;
Index1 : Integer;
Index2 : Integer) : Integer;
begin
//comparer for custom sort used in SortLTSGrid
if List[Index1] = List[Index2] then
Result := 0
else if List[Index1] < List[Index2] then
Result := 1
else
Result := -1;
end;
procedure TfrmPuntehou.SortLTSGrid(var grid: TStringGrid; columntotal: Integer);
var
TheList : TStringList;
i,l,iCount,m:integer;
const
separator = ',';
const
arrCodes:array[1..10] of string = ('DNF','DNS','WD','WE','DNA','OD','RD','EXR','EXE','PP');
begin
//sorts grid largest to smallest according to one column
//get grid row amount
iCount:=grid.RowCount - 1;
//create and fill the string list
TheList := TStringList.Create;
//fill the list
for i := 1 to (iCount) do
begin
for l := 1 to Length(arrCodes) do
begin
if grid.Rows[i].Strings[columntotal] = arrCodes[l] then
begin
TheList.Add('0'+separator+grid.Rows[i].Text);
end;
end;
TheList.Add(grid.Rows[i].Strings[columntotal]+separator+grid.Rows[i].Text);
end;
//try block to sort and write all strings in the list to the grid correctly
try
TheList.CustomSort(Compare2);
for i:= 1 to (iCount) do
begin
grid.Rows[i].Text := TheList.Strings[(i-1)] ;
end;
//fill the row numbers
for m := 1 to iCount do
begin
grid.Cells[0,m]:= IntToStr(m);
end;
finally
TheList.Free;
end;
end;
【问题讨论】:
-
使用
TryStrToInt检测值是否为整数,如果是,请确保它们始终排在其他所有值之后。 -
@DavidHeffernan 我看到这个函数返回一个布尔值,那我应该检查真假吗?
-
我很困惑。所有列都包含相同的元素。然而,它适用于除“决赛”之外的所有人吗?您想要与其他人不同的“决赛”顺序吗?在显示的表格中,敌人的例子,我看不出它如何适用于“Heat 2”而不适用于“Final”
-
@dsm 简而言之,是的。我也不确定为什么最后一栏充满了它。问题是我排序的所有其他列只有整数值,而 FINAL 中有字符串和整数。 SUB 和 TOTAL 列分别是总计/小计,FINAL 列代表特定组晚上的最后阶段/比赛(我正在改进我为当地的土椭圆赛车俱乐部编写的软件)。因此,可能有一个赛车手没有完成,例如,该赛车手列中的单元格中会有一个 DNF。所以那些参加比赛的人应该显示在那些没有参加比赛的人之上
-
这就是我上面提到的问题所在
标签: sorting delphi tstringlist