一直有個想法。SuperObject這麼好用的Json簡析類,序列化出來的Json排序是亂的。
有時候想用SuperObject做儲存樹資料。這樣一來排序都是亂亂的也就放棄了,這幾天想改造一下SuperObject類。
将改造過程記下。以便以後查閱。
最初想法
增加ISuperObject屬性SortMode:Integer排序方式(0:預設方式, 1:添加順序, 2:升序)
缺點:
因為每個值都是一個TSuperObject對象。如果每個TSuperObject添加SortMode屬性, 考慮的地方太多。
開始認為預設的方式是安裝降序排列的,後來深入代碼發現通過下面的方法計算key的值再進行比較得出進行排序。
class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
var
h: cardinal;
i: Integer;
s: string;
begin
h := 0;
//modify mofen without case
s := LowerCase(k);
for i := 1 to Length(s) do
begin
//origial
h := h * 129 + ord(s[i]) + $9E370001;
//h := h + ord(s[i]) * (1 shl (i * 3));
end;
Result := h;
end;
從上面代碼可以看出如果字母多,肯定比字母計算出來的Hash值要大。
--此方案不妥