天天看点

SuperObject(Delphi最好的JSON简析类) 扩展功能----排序(4)最终揭秘 解决sosmAdd模式不能查找的问题

经过对代码的更深入的跟踪理解,发现了superobject采用的是平衡二叉树的方式保存数据的。

首先看看保存数据的类

TSuperAvlEntry = class

  private

    FGt, FLt: TSuperAvlEntry;

FGt和FLt分别是保存通过比较(比较hash或者比较key的asc)大的保存在Gt,小的保存在Lt,是一个二叉树链表。

先上图

SuperObject(Delphi最好的JSON简析类) 扩展功能----排序(4)最终揭秘 解决sosmAdd模式不能查找的问题

假如有如下Json

"assign": {

   "FAreaKey": "FKey",

   "FAreaName": "FName",

   "FAreaCode": "FCode",

}

按照sosmASC排序模式

1.首先插入的是FAreaKey节点,

2.然后插入的是FAreaName时跟Root就是FAreaKey进行比较那他会插入到FAreaKey对应的节点的Gt下图形A1表示

3.然后插入的是FAreaCode跟FAreakey比较时为较小的插入到LT下面如图A2表示

4.A2图已经为平衡二叉树。

再看看按sosmAdd排序模式

按照sosmAdd的模式的话都是排在后面也就是都放在GT位置

3.然后插入的是FAreaCode跟FAreakey比较时因为GT位置已经有了FAreaName,此时再跟FAreaName比较也是为大的插入FAreaName的GT下面如图B1表示

4.如图B1表示经过平衡二叉树后变成了B2样式。

这样查找的话,因为sosmAdd的查询时都是查找GT位置,不会查找LT分支,所以查询FAreaKey时会查询不到。

所以简单的办法就是如果安装sosmAdd方式存储是不进行平衡二叉数,这样所有的数据都保存在GT位置。这样就成为了一个链表的方式,这样可以从头查到尾。必然可以查到。

*****深入研究后发现查询时之前的不区分Key的大小写的修改其实很容易做到。

最终的Insert代码为