在寫程式時,經常要用到樹的這種結構,如果是做介面程式設計,那麼treeview是乙個不錯的選擇,幾個設定就能把資料繫結好,但是如果自己寫類呢?相對就麻煩一點。
這裡討論一下如何快速建立自己的樹型結構,即怎麼把建樹的方法抽離出來加以復用。
**的復用,不外乎類,介面,泛型。
先考慮用介面來實現,定義乙個itreenode 然後每乙個要建立樹型結構的結點去實現?感覺不大好,因為你要定義比如parent children等一系列的東西,很是很麻煩,每乙個實現起來也很困難。
那抽像類?抽象類的繼承到是方便,但是在實際使用中涉及各種型別轉換,**寫起來不爽。
泛型呢?泛型的結構又過於籠統 ,但是可以折衷一下,就是用泛型定義乙個結點的類
(小弟寫**方式都相對「妥協」,一位大人說的,各位將就著看哈)
1namespace soway.db.tree2 7
public treenodeparent
8public list> children
9 }
10 }
結點類定義好了以後,就要去實現乙個 treefactory ,將建樹的通用演算法提出來。
namespace soway.db.tree}}
這裡的我的方法名已經預設為bylevel ,即按層建立樹,這樣,新的問題又出現了:
1.怎麼保證輸入值items是已經按層遍立建立好的結點?
2.怎麼分層?即怎麼區分樹的父結點,子結點,同級結點之間的關係 ?
這些問題其實都與泛型的具體型別有關,但如果把具體型別約束了,那就違反我們本意了。
走一步算一步,先這樣,把樹結點之間的關係定義出來,算是乙個列舉吧:
namespace soway.db.tree
}有了這個關係以後,於是有了進一步的想法,考慮傳遞給treefactory乙個委託,可以通過這個來得到兩個結點之間比較關係:
namespace soway.db.tree
這樣,我們的treefactory裡多了乙個泛型委託的成員。。。
private teenodecomparecompare;
public treefactory(tree.teenodecomparecompare)
現在,當這個泛型委託處理好了以後,我們下一步問題也好辦了,就是將輸入的items進行按層排序,這時,只要有乙個comparison()的實現 ,我直接呼叫 list.sort(comprarion)即可了
下面給出這個comparation的實現 :
private
int compareresult(t ob1, t ob2)
}好,這些基礎工作做完以後,建樹的就容易了:
//////
按層建立樹
//////
建立樹的集合
///建立好的樹結構
public list> createtreebylevel
(listitems )
;//生成要新增的資料
queue.enqueue(addednode);//
入隊//
看是否到了下一層的結點
if (lastnode != null &&
(compare(addednode.data, lastnode.data) == tree.teenodecompareresult.child
|| compare(addednode.data, lastnode.data) == tree.teenodecompareresult.nexlevelnode)//
)//找到對應的父結點
while (currentnode != null
&&compare(addednode.data, currentnode.data) != teenodecompareresult.child
)if (currentnode !=null && compare(addednode.data, currentnode.data) != teenodecompareresult.equealnode)
current.add(addednode);
lastnode = addednode;}}
return result;
}下面是乙個使用的demo ^_^
//類:
public
string name
public string url
public
string view
public
string action
public
string text
public
string image
public
override
string tostring()}//
比較結點的關係:
static soway.db.tree.teenodecompareresult compare(auth ob1, auth ob2)
///主函式中
var c = new soway.db.dbcontext(builder.tostring());
var items = c.get();//
初始化var tree = new treefactory(new teenodecompare(compare)).createtreebylevel(items);//
建立樹型結構
關於android中一種簡單的分享方式
目前第三方分享方式有兩種 優點 無縫整合,功能多 缺點 整合官方sdk包進行開發,且需要申請官方的授權 優點 及其簡單,不需要sdk和官方授權 這裡我介紹下第二種分享方式,這種分享方式在應用寶和android版百變相機中有應用。典型的 如下 override public void onclick ...
Makefile的一種通用寫法
管理linux環境下的c c 大型專案,如果有乙個智慧型的build system會起到事半功倍的效果,本文描述linux環境下大型工程專案子目錄makefile的一種通用寫法,使用該方法,當該子目錄內的檔案有增刪時無需對makefile進行改動,可以說相當的智慧型。下面先貼 為減小篇幅,一些非關鍵...
一種包含了情感資訊的詞向量生成方法
今天我要講的 主要參考了一篇2011年的acl會議 learning word vectors for sentiment analysis 這篇文章的作者有andrew y.ng,因此整個文章的質量還是 的。我剛看到這篇 的時候,就感到有點奇怪,因為目前業界用的最廣泛的word2vec演算法是20...