在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在superObject中添加排序类型 type //add By Mofen
添加全局设置方法 var //设置排序模式 Mofen
需要改造的类主要为 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 = nil) then 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 <> 0) then 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;
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论