天天看點

SuperObject(Delphi最好的JSON簡析類) 擴充功能----排序(2)

在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 = 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;

上一篇: eureka