VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1329|回复: 10

时间数组排序问题?

[复制链接]

1

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-3-4 15:00:02 | 显示全部楼层 |阅读模式
我现在有个数组,里面存放的是时间格式的数据,想把它按一定的顺序排列一下,以方便我找到自己想找的数据,怎么做啊?

有哪位知道帮个忙吧?我不胜感激!
回复

使用道具 举报

1

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-20 13:00:02 | 显示全部楼层
var
  a: array[0..1024] of tdatetime;
  i: integer;
  b: tdatetime;
begin
  a[i] := datetimepicker1.datetime; //加多个时间

  {对数组进行排序}

  b := a[i];  //这就是要的结果
end;
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-5-21 07:15:01 | 显示全部楼层
你把时间格式化(FormatDateTime('YYYY-MM-DD HH:MMMM:SS', A[I]))加入到一个TStringList里面,根据你的要求写定排序函数因子(如升、降序),然后用CustomSort排序。 在取出数据时再把字符串格式化成TDateTime(B[I] := StrToDateTime(SL[I]))
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-5-21 22:15:01 | 显示全部楼层
function Compare(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := CompareText(List[Index1], List[Index2]);  //升序
end;

procedure TFormDemo.ButtonDemoClick(Sender: TObject);
var
  A: array[0..1024] of TDateTime;
  I: Integer;
  B: TDateTime;
  SL: TStringList;
begin
  Randomize;
  SL := TStringList.Create;
  for I := 0 to 1024 do
  begin
    A[I] := DateUtils.IncHour(Now, Random(24));
    SL.Add(FormatDateTime('YYYY-MM-DD HH:MMMM:SS', A[I]));
  end;
  SL.CustomSort(@Compare);
  ListBox.Items := SL; //看看结果
  B := StrToDateTime(SL[5]);
end;
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-5-22 08:15:01 | 显示全部楼层
当然你也可以在排序后给A[I]重新按序赋值
回复

使用道具 举报

1

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-5-23 09:00:01 | 显示全部楼层
你好厉害, 我看到排序的结果了!
我改一下我的代码,看看可不可以。
其实我最终要的就是用另外一个时间去找这个数组里与它最近的那个时间,我想排完后再找就不是难事了。
回复

使用道具 举报

1

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-6-2 14:30:01 | 显示全部楼层
还是不行,时间数据是排序了,但是我去没法把我要的那个数据找出来啊!
这样的:
stringlist里面的那个最大的小于指定数的数怎么找,没怎么用过stringlist,你再指点一下!!
万分感谢!
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-6-3 21:30:01 | 显示全部楼层
如果你想找离你给出的时间最近的时间,用得着先排序么?就直接遍历一次不就可以了么?。当然,如果你的时间数组是固定得,而且需要多次,反复查找,先排好序还是有些用处。
排序就用冒泡法即可。但找时间得时候可以采用二分法。
回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-6-3 23:30:01 | 显示全部楼层
补充一点,日期时间在内存中实际上就是浮点数。浮点数排序应该不难吧。
回复

使用道具 举报

0

主题

25

帖子

18.00

积分

新手上路

Rank: 1

积分
18.00
发表于 2020-7-11 16:15:01 | 显示全部楼层
呵呵,要活学活用.改变一下比较因子就可以了.如下:

const
  Point = '2016-1-6 12:00:00';


function Compare(List: TStringList; Index1, Index2: Integer): Integer;
var
  Diff1, Diff2: Double;
begin
  Diff1 := ABS(StrToDateTime(List[Index1]) - StrToDateTime(Point));
  Diff2 := ABS(StrToDateTime(List[Index2]) - StrToDateTime(Point));
  if Diff1 > Diff2 then
    Result := 1;
  if Diff1 = Diff2 then
    Result := 0;
  if Diff1 < Diff2 then
    Result := -1;
end;

procedure TFormDemo.ButtonDemoClick(Sender: TObject);
var
  A: array[0..1024] of TDateTime;
  I: Integer;
  B: TDateTime;
  SL: TStringList;
begin
  Randomize;
  SL := TStringList.Create;
  for I := 0 to 1024 do
  begin
    A[I] := DateUtils.IncHour(Now, Random(24));
    SL.Add(FormatDateTime('YYYY-MM-DD HH:MMMM:SS', A[I]));
  end;
  SL.CustomSort(@Compare);
  ListBox.Items := SL; //看看结果
  B := StrToDateTime(SL[0]); //最近的时间
end;

我上面是取的差异的绝对值.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表