首页
社区
课程
招聘
[求助]delphi数组排序后取对应元素内容,请教大家,谢谢。
发表于: 2014-3-16 11:20 5355

[求助]delphi数组排序后取对应元素内容,请教大家,谢谢。

2014-3-16 11:20
5355
type                              
  TMyArr = packed record
    a: Integer;
    TmpLen: Integer;
  end;
排序前TmpLen和a这个元素的值如下:
MyArr[0].TmpLen := 6
MyArr[0].a := 100
MyArr[1].TmpLen := 4
MyArr[1].a := 200
MyArr[2].TmpLen := 5
MyArr[2].a := 800
MyArr[3].TmpLen := 2
MyArr[3].a := 500
MyArr[4].TmpLen := 3
MyArr[4].a := 900
MyArr[5].TmpLen := 1
MyArr[5].a := 1000
------------------------------------------------------------------

for i := High(MyArr) downto Low(MyArr) do //冒泡算法排序
    begin
      for j := Low(MyArr) to i do
      begin
        if MyArr[j].TmpLen > MyArr[j + 1].TmpLen then
        begin
          n := MyArr[j].TmpLen;
          MyArr[j].TmpLen := MyArr[j + 1].TmpLen;
          MyArr[j + 1].TmpLen := n;
        end;
      end;
    end;
   for i := Low(MyArr) to High(MyArr) do //冒泡算法排序
    begin
       MyForm.MeMo3.Lines.Add(inttostr(MyArr[i].TmpLen) + 'A:' + inttostr(MyArr[i].a));   //输出信息
    end;
      我从小到大排序MyArr[i].TmpLenp这个元素,我现在想取出排序后对应 MyArr[i].a 这个元素的内容,该怎么做.实现如下结果:
MyArr[0].TmpLen := 1 对应 MyArr[0].a := 1000
MyArr[1].TmpLen := 2 对应 MyArr[1].a := 500
MyArr[2].TmpLen := 3 对应 MyArr[2].a := 900
MyArr[3].TmpLen := 4 对应 MyArr[3].a := 200
MyArr[4].TmpLen := 5 对应 MyArr[4].a := 800
MyArr[5].TmpLen := 6 对应 MyArr[5].a := 100

请懂delphi的大哥帮忙看下,谢谢。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 95
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我自己用种笨办法解决了,但不太好。有没有效率高点的办法。

function GetArrNum(Value: Integer): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := Low(MyArr) to High(MyArr) do
  begin
    if MyArr[i].TmpLen = Value then
    begin
      Result := i;
      Break;
    end;
  end;
end;

for i := Low(MyArr) to High(MyArr) do
    begin
       MyForm.MeMo3.Lines.Add(inttostr(MyArr[i].TmpLen) + 'A:' + inttostr(MyArr[GetArrNum(MyArr[i].TmpLen)].a));   //输出信息
    end;
2014-3-16 12:54
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
我是真想帮你,可是你的意思表达不清楚。
  你是想把压缩数组按tmpLen 排序后,再输出a的内容吗,还是什么
2014-3-16 13:26
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
type                              
  TMyArr = packed record
    a: Integer;
    TmpLen: Integer;
  end;
排序前TmpLen和a这个元素的值如下:
MyArr[0].TmpLen := 6
MyArr[0].a := 100
MyArr[1].TmpLen := 4
MyArr[1].a := 200
MyArr[2].TmpLen := 5
MyArr[2].a := 800
MyArr[3].TmpLen := 2
MyArr[3].a := 500
MyArr[4].TmpLen := 3
MyArr[4].a := 900
MyArr[5].TmpLen := 1
MyArr[5].a := 1000

//temp:TMyArr

for i:=1 to N-1 do  //N 是数组长度
  for j:=N downto i+1 do
  begin
    if myArr[j].tmpLen < myArr[i].tmpLen  then
    begin  //数组全部交换
       temp.tmpLen:=myArr[i].tmplen
       temp.a     :=myArr[i].a;

       myArr[i].tmplen :=MyArr[j].tmpLen;
       myArr[i].a;     :=myArr[j].a;
      
       myArr[j].tmplen :=temp.tmpLen;
       myArr[j].a;     :=temp.a;
    end;
  end;
for i:=1 to N do
  Myform3.memo3.Lines.add('MyArr['+inttostr(i)+'].TmpLen:='+inttostr(myArr[i].tmpLen) + 'MyArr['+inttostr(i)+'].a:='+inttostr(myArr[i].a));
2014-3-16 13:35
0
雪    币: 95
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
[QUOTE=nig;1268392]type                              
  TMyArr = packed record
    a: Integer;
    TmpLen: Integer;
  end;
排序前TmpLen和a这个元素的值如下:
MyArr[0].TmpLen := 6
MyAr...[/QUOTE]

感谢大哥的细心指教,谢谢。
我的意思是
从小到大排序排序MyArr[i].TmpLenp这个元素,我上面的冒泡排序正常,现在是想取出MyArr[i].a这个元素的内容。
2014-3-16 16:18
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=laosanls;1268417]感谢大哥的细心指教,谢谢。
我的意思是
从小到大排序排序MyArr[i].TmpLenp这个元素,我上面的冒泡排序正常,现在是想取出MyArr[i].a这个元素的内容。[/QUOTE]

这个A的内容是可以取到的,你的意思是排序后位置变了,还是a 的内容取不到,要不别麻烦群里人了,我的QQ 76451925,上QQ后我给你解释吧!

我上面的例子就是从小到大排序,在myArr[0]中存放的就是最小的 tmplen的数,之后再按排好序的tmplen从小到大,输出 a  的值。
2014-3-17 09:53
0
雪    币: 95
活跃值: (389)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
[QUOTE=nig;1268520]这个A的内容是可以取到的,你的意思是排序后位置变了,还是a 的内容取不到,要不别麻烦群里人了,我的QQ 76451925,上QQ后我给你解释吧!

我上面的例子就是从小到大排序,在myArr[0]中存放的就是最小的 tmplen的数,之后再按排好序的tmplen从小到大,输出 a  的值。[/QUOTE]

加了楼上大哥QQ,非常成功帮忙解决问题,再次感谢!祝工作顺利,全家幸福安康。
2014-3-17 12:06
0
游客
登录 | 注册 方可回帖
返回
//