在建樹之前,對資料來源進行處理。
首先根據該線性表的id(string)進行排序,排序後遍歷該錶刪除id開頭相同的節點,保留id長度最長的節點。如「11」,「1101」,「110101」,只保留最後的「110101」這個節點,其他節點刪除。字串長度越短,則等級越小,屬於祖父節點,字串越長,等級越大,屬於子節點,最大的為葉節點。排序後的結果如下圖:
因為在建樹的時候會根據id查詢它的父節點,祖父節點以及它所有下屬子節點,然後再建樹。
@override
public defaultzone getdefaultzone
(integer customerid)
i++;}
distinctzones.
add(zones.
get(i-1)
);zones = distinctzones;
//建樹,返回最終的結果
if(zones != null && zones.
size()
>0)
defaultzone result =
newdefaultzone
(zone, regions.
toarray
(new
region
[regions.
size()
]));
return result;
}else
}
按照字串大小順序排序完的線性表如下表
即是只要等級最高的祖父節點,同等長度的則只要相同名父節點乙個。如上圖劃紅線是所要的資料。北京一列,就是以11開頭,只要北京(**為11,最短)。江蘇省一列,沒有江蘇省,則在江蘇省下的***市除重名,只要以3211,3212開頭的各乙個。主要有這兩種情況。
@override
public defaultzone getdefaultzone
(integer customerid)
int sub=rid1.
length()
>
2?rid1.
length()
-2:2
;if(rid.
startswith
(lastregionid)
&&rl<=level&&count==0)
elseif(
!rid1.
startswith
(lastregionid.
substring(0
,2))
)if(rid1.
length()
>2)
}}zones = distinctzones;
if(zones != null && zones.
size()
>0)
defaultzone result =
newdefaultzone
(zone, regions.
toarray
(new
region
[regions.
size()
]));
return result;
}else
}private region findregionontree
(list
regions, string regionid)
return null;
}
樹型結構的設計
最近做專案,經常用的樹型結構,對樹型表的設計有了新的理解.原來設計的樹型表結構 體現了一種遍歷的方式.用編碼控制相應的父子關係,雖然這樣也體現了關係,但在做轉移子樹時就相當麻煩了,而且邏輯關係也不清晰.這次的設計 改用父節點控制父子關係,同時提供乙個排序號,提供一種遍歷,可以增加多個字段,來擴充套件...
Trie樹 高階樹型結構
trie樹應用 trie 樹中文名叫字典樹 字首樹等等。這些名字暗示其與字元的處理有關,事實也確實如此,它主要用途就是將字串 當然也可以不限於字串 整合成樹形。它的核心思想就是通過最大限度地減少無謂的字串比較,使得查詢高效率,即 用空間換時間 再利用共同字首來提高查詢效率。典型應用於統計和排序大量的...
樹型表結構的查詢
connect by 是結構化查詢中用到的,其基本語法是 select from tablename start by cond1 connect by cond2 where cond3 簡單說來是將乙個樹狀結構儲存在一張表裡,比如乙個表中存在兩個字段 id,parentid那麼通過表示每一條記錄...