listbox的排序问题。得分机会!!!!!

kmask 2002-06-22 06:08:30
有两个 listbox 目的是把listbox1里面的内容排序后显示在 listbox2 里
===============================================
listbox1 listbox2

内容 index 内容 index

43 1 18 5
29 2 25 3
25 3 -------> 25 6
72 4 29 2
18 5 43 1
25 6 72 4

关键是 index 的问题,也就是说,排序后的INDEX也要一一对应

我折腾了半天,解决不好 INDEX的问题,对于重复值的INDEX无法正确记录,现已陷入
牛角尖。

请各位帮忙
...全文
526 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnsonrao 2002-06-23
  • 打赏
  • 举报
回复
如果是相同字符串,为什么一定要分个先后呢?
是不是后台有数据表支持,否则很难想象你有什么目的,或许把目的讲出来会有更好的解决办法。
naughtyboy 2002-06-23
  • 打赏
  • 举报
回复
不知道用链表能不能实现
kmask 2002-06-23
  • 打赏
  • 举报
回复
多谢 johnsonrao(johnson)的关注与回复。

加数组来控制我其实也试过了,先记录重复值的INDEX,然后在在排序之后,依次加入,结果越弄越麻烦,头大的很哪。
johnsonrao 2002-06-23
  • 打赏
  • 举报
回复
重复值的确很难处理,除非再加一个数组来控制。
王集鹄 2002-06-23
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
{ TODO : 载入文本 }
for I := 0 to ListBox1.Items.Count - 1 do
ListBox1.Items.Objects[I] := Pointer(I);
ListBox1.Sorted := True;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
if ListBox1.ItemIndex < 0 then Exit;
Caption := IntToStr(Integer(ListBox1.Items.Objects[ListBox1.ItemIndex]));
end;
johnsonrao 2002-06-23
  • 打赏
  • 举报
回复
也学了一招
naughtyboy 2002-06-23
  • 打赏
  • 举报
回复
如果用两个listbox,对于同一数值,比如48,在listbox1中index为0
到了listbox2终究不是0,这大概是因为在你输入值的时候,listbox
已经为你分配好了index.所以我觉得搂主的想法不太可能实现
kmask 2002-06-23
  • 打赏
  • 举报
回复
昨晚看了quick sort的代码,受到启发,同zswang(伴水) 的解决办法基本一致,
原来 objects 是这样玩的,嘿嘿。

多谢各位的关注

结帐
kmask 2002-06-23
  • 打赏
  • 举报
回复
昨晚看了quick sort的代码,受到启发,同zswang(伴水) 的解决办法基本一致,
原来 objects 是这样玩的,嘿嘿。

多谢各位的关注

结帐
johnsonrao 2002-06-23
  • 打赏
  • 举报
回复
用数据表来处理会影响速度?否则光排序算法就很麻烦了。
WuHeHai 2002-06-23
  • 打赏
  • 举报
回复
我觉的可以把Strs1中的各个Item及其Index,组成一个对象
TIndexItem = class
public
Item: String;
Index: Integer;
end;
现在可以从未排序的内容形成一个TIndexItem列表,然后这个TIndexItem进行排序,排序的依据自然是Item字符串。排序后的TIndexItem列表中的Item列表,自然就是排过序的内容,Index列表就是排过序的内容所对应在未排序内容列表中的Index.这样就不会出现重复健的问题。
manboo 2002-06-23
  • 打赏
  • 举报
回复
因为TStrings的Items里面不只能加入字符还可以加入对象,这样能够解决您的问题的!
kmask 2002-06-23
  • 打赏
  • 举报
回复
回johnsonrao(johnson):

简单的作个例子,拿原贴中的数据实现。如下:

我随机的抽取一个目录下的 所有*.txt 中的文字,如:从 a.txt 中抽18个字
从b.txt中抽25个字…………当然,实现的目的不是这个。
也就是说,18,25等数值还有着各自的关联。是原来的程序中出现的问题,现在发生了处理重复值的错误,不得不想办法啦。唉
kmask 2002-06-22
  • 打赏
  • 举报
回复
我用 listbox 只是为了说明问题,实际上运行时是不会显示出来的,我用的是tstrings

其实一共应该有 3 个 strings, 一个放未排序的内容,一个放已经排序国的内容,还有一个放已排序过后的 INDEX ,详情请参照原贴

这样的工作我目前认为只能一行一行的来做,一个 sorted 无法解决问题,index才是我的关键

我试国 manboo(L—横刀--L)的办法,先排序,后加入,也试国先加入,后排序,都是在处理 listbox1的重复值时出现误差。

有劳各位
surfguy 2002-06-22
  • 打赏
  • 举报
回复
就用一个listbox1.sorted:=true就行了 。
manboo 2002-06-22
  • 打赏
  • 举报
回复
先将数据排序,然后加入,这样较快,省去了数据移动的时候的显示开销!
johnsonrao 2002-06-22
  • 打赏
  • 举报
回复
一定要用 ListBox2?

ListBox2.Items:=ListBox1.Items;
ListBox2.Sorted:=True;

有两个 listbox 目的是把listbox1里面的内容排序后显示在 listbox2 里
排序后的INDEX也要一一对应

有哪点没满足你的要求?
happyjoe 2002-06-22
  • 打赏
  • 举报
回复
你把listbox1中每项的index放在listbox2的相应项的object里面
例子:
procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.AddObject('18', Pointer(5));
ListBox1.Items.AddObject('25', Pointer(3));
......
end;

procedure TForm1.ListBox1Click(Sender: TObject);
var
I: Integer;
begin
I := Integer(TListBox(Sender).Items.Objects[TListBox(Sender).ItemIndex]);
Caption := IntToStr(I);
end;


listbox2的index就不要使用了
kmask 2002-06-22
  • 打赏
  • 举报
回复
麻烦你看清楚帖子内容行吗???

你认为一个sorted值100分吗???
johnsonrao 2002-06-22
  • 打赏
  • 举报
回复
可以不用 ListBox2,
只要将 ListBox1.Sorted:=True 就行。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧