怎么对一些汉字string进行排序?(50分请笑纳)(50分)

  • 主题发起人 主题发起人 Beast
  • 开始时间 开始时间
B

Beast

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个汉字字符串组成的数组,既然在combobox里面可以自动排序,那么编程如何实现呢?
 
一句话: ComboBox1.Sorted:=true;
中文排序是根据拼音的首字母排序的.
 
取汉字的内码,以区或位码确定排序的标准。
 
ComboBox.sorted:=true;
 
CompareStr()函数比较两个字符串大小
CompareText()函数类似,但不区分大小写
具体情况去看Delphi帮助吧

能够比较两个字符串,然后再“冒泡”一下,就可以了
 
排序方法很多的,每种算法各有优缺点.去看看数据结构吧.
 
大家真的认为我如此的白痴?
要不然就是没有看清楚我的问题?
jams,你的回答正是我想知道的,讲的详细一点吧!
charles,你到是告诉我怎么得到拼音呐!!!!
各位大虾请继续努力吧!
 
让ComboBox为你排序.
生成一个Visible为false的ComboBox1;
先让ComboBox1.Sorted:=false;
把汉字字符串组成的数组放到combobox里面后
再让ComboBox1.Sorted:=true;
最后从ComboBox1中取出已排好序的字符串数组.
没试过的说.
 
取汉字拼音的头一个字母
const ChinaCode: array[0..25,0..1] of Integer = ((1601,1636),
(1637,1832), (1833,2077),(2078,2273),(2274,2301),(2302,2432),
(2433,2593),(2594,2786),(9999,0000),(2787,3105),(3106,3211),
(3212,3471),(3472,3634),(3635,3722),(3723,3729),(3730,3857),
(3858,4026),(4027,4085),(4086,4389),(4390,4557),(9999,0000),
(9999,0000),(4558,4683),(4684,4924),(4925,5248),(5249,5589));

function GetHzPy(var Hz:String):String

var
C1, Len1, C2: Integer;
ir : Word;
FResult : String;
begin
FResult := '';
C1 := 1;
Len1 := Length(Hz);
while (C1<=Len1) do
begin
if (ord(Hz[C1])>=160) and (ord(Hz[C1+1])>=160) then
begin
ir := (ord(Hz[C1])-160)*100 + ord(Hz[C1+1])-160;
C2 := 0;
while (C2<=26) do
begin
if (ir>=ChinaCode[C2,0]) and (ir<=ChinaCode[C2,1]) then
begin
FResult := FResult+UpCase(chr(C2+ord('a')));
break;
end;
C2 := C2 + 1;
end;
end;
C1 := C1 + 2;
end;
Result := FResult;
end;
 
有那么麻烦吗?
汉字内码就是按拼音排序的嘛!
CompareStr就是按内码排序的嘛!管你是汉字还是什么,
你随便拿两个汉字串CompareStr试一下,看看结果再说
 
其实,汉字排序与字库有关!
一级字库的确以拼音排序,而且直接用sorted就可以;
二级字库涉及一些生僻字,所以它总是排在一级字库的后面,用sorted无法直接实现正确排序.
试试 "鳗鱼"和"组合" 两个词, 鳗鱼就排在组合后面.
解决方法我也不知道, 关注高手高招...
 
我找到了:
Win 32 API:CompareStringA,CompareStringW
Delphi声明:
function CompareString(Locale:LCID;dwCmpFlags:DWORD;
lpString1:PChar;cchCount1:Integer;
lpString2:PChar;cchCount2:Integer):Integer
stdcall;

返回值:
1:S1在词汇顺序上小于S2
2:等于
3:大于

示例:
procedure TForm1.Button1Click(Sender: TObject);
var
S1:String;
S2:String;
Result:Integer;
begin
S1:='鳗鱼';
S2:='组合';
Result:=CompareString(LOCALE_SYSTEM_DEFAULT,0,
PChar(S1),Length(S1),
PChar(S2),Length(S2));
Caption:=IntToStr(Result);
end;
结果:1,'鳗鱼'<'组合'

详细说明见Win 32 API Help
 
用以下代码就行了:

procedure GetQWCode(HZ: string
var Q, W: Word);
begin
Q := Byte(HZ[1]) - $A0
这是区码
W := Byte(HZ[2]) - $A0
这是位码
end;
然后比较.Good luck!
 
Beast:
把分给我和Schiesser,结束吧
 
谁说汉字内码是按拼音排序的?
那是dos时代的产物. 一级字库按拼音排序, 二级字库的字按肯定排在一级
字库后面(尽管它的拼音可能是'a'). 大字库也一样, 为了和过去中文的兼容
嘛, 所以中文字的排序是根据区位码来的. 和拼音没有直接关系.
 
呵呵,蚯蚓等不急了。:-)
 
试试 ComboBox 和 Table 中的不同效果:
ComboBox中能以拼音排序,而Table中好象是以内码排序的...
 
大家没看清吧?
Beast要的是ComboBox的排序效果,
也就是按词汇顺序(拼音)排列,不是按内码排

前面已经说了:
Win 32 API:CompareStringA,CompareStringW 可以实现这种比较功能,
这不就解决了吗?
 
其实我刚刚把问题粘出来就发现了CompareStringA,CompareStringW这两个api,
白白浪费了50分,至于用combobox的方法我想到了,但是这样解决问题似乎有点
“野仙”的味道,于是我认为用以上的两个api来解决最简便。还有一些能返回拼
音的控件也非常好,但是程序的大小吗!呵呵,我有一个不依靠输入法产生拼音
的控件,相当爽!感谢各位的帮助!
因为最近有事,四天没有上网,让各位等急了,抱歉!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
385
import
I
后退
顶部