• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

SuperObject(Delphi最好的JSON简析类)扩展功能----排序(2)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在superObject中添加排序类型

type //add By Mofen
  TSOSortMode = (sosmDefault {默认的方式}, sosmAdd {添加的顺序}, sosmASC {升序}, sosmDesc {降序});

 

添加全局设置方法

var
  nowSortMode: TSOSortMode = sosmDefault;

//设置排序模式 Mofen
procedure SetSOSortMode(pvSortMode: TSOSortMode);
begin
  nowSortMode := pvSortMode;
end;

 

需要改造的类主要为

TSuperAvlTree

其中需要改造的方法有

Insert序列化出来的顺序

Search搜索路径

Delete删除

 

首先主要看看Insert方法,修改该方法后,可以看到so.asJson,可以看到序列化的结果,顺序是按照我们设定的顺序排列的

 1 function TSuperAvlTree.Insert(h: TSuperAvlEntry): TSuperAvlEntry;
 2 var
 3   unbal, parentunbal, hh, parent: TSuperAvlEntry;
 4   depth, unbaldepth: longint;
 5   cmp: integer;
 6   unbalbf: integer;
 7   branch: TSuperAvlBitArray;
 8   p: Pointer;
 9 begin
10   inc(FCount);
11   h.FLt := nil;
12   h.FGt := nil;
13   h.FBf := 0;
14   branch := [];
15 
16   if (FRoot = nilthen
17     FRoot := h
18   else
19   begin
20     unbal := nil;
21     parentunbal := nil;
22     depth := 0;
23     unbaldepth := 0;
24     hh := FRoot;
25     parent := nil;
26     repeat
27       if (hh.FBf <> 0then
28       begin
29         unbal := hh;
30         parentunbal := parent;
31         unbaldepth := depth;
32       end;
33       if hh.FHash <> h.FHash then
34       begin
35         if nowSortMode = sosmDefault then
36         begin
37           //original code  //这里是原始的方法,比较两个Key的hash值来决定存放的位置
38           if hh.FHash < h.FHash then cmp := -1 else
39             if hh.FHash > h.FHash then cmp := 1 else
40               cmp := 0;
41         end else
42         begin
43           // modify by mofen  //如果要进行排序,我们可以根据比较两个值的Key来决定存放的位置, 要进行排序,无可争议,必须比较Key而不能比较Key的hash值
44           cmp := CompareForSortModeString(h.Name, hh.Name);
45         end;
 1 function TSuperAvlTree.CompareForSortModeString(pvKey1, pvKey2: SOString):
 2   Integer;
 3 var
 4   cmp: integer;
 5   lvKey1, lvKey2: SOString;
 6 begin
 7   lvKey1 := LowerCase(pvKey1);
 8   lvKey2 := LowerCase(pvKey2);
 9   if lvKey1 <> lvKey2 then
10   begin
11     case nowSortMode of
12       sosmAdd: cmp := 1;
13       sosmASC: if lvKey2 < lvKey1 then cmp := 1 else if lvKey2 > lvKey1 then cmp := -1;
14       sosmDesc: if lvKey2 < lvKey1 then cmp := -1 else if lvKey2 > lvKey1 then cmp := 1;
15     else
16       raise Exception.Create('默认排序不采用compareForSortModeString');
17     end;
18   end else
19     cmp := 0;
20   Result := cmp;
21 end;

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
1 MATLAB常微分方程求解发布时间:2022-07-18
下一篇:
6. MATLAB解微分方程问题(龙格库塔法)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap