0 开场白元素项类的设计
開場白:
很長時間以來一直想把以前所學習的一些基本算法整理一遍,最近準備利用周末的時間在博客園寫一個算法系列,留作記錄以備將來查看。首先從“元素項類” 談起。
所有源代碼在google code上http://code.google.com/p/algolib-java/ 下載或者直接猛擊:/Files/luweiseu/Source_codes.rar
轉載地址:http://www.cnblogs.com/luweiseu/archive/2012/07/13/2590697.html
?
?
??? 在線性表以及其它的數據結構中,每個元素都包含數據區,即我們這里講的“元素項”(Element?Item)。元素項的元素值可以是數值類型,如整數、浮點數等;也可以是字符型,如String,char。一般情況下,元素項的類型在同一個線性表中是相同的,但是不能排除類型不同的情況發生。在本書接下來的很多章節將會涉及到元素項的使用及操作,本節內容將重點介紹元素項類的設計和實現。
本系列中采用泛型類編程方法,即元素項建立泛型類(generic?type)。元素項類的對象的具體類型可以是任意的,如Integer(整數類型)、Double(雙精度類型)、String(字符串類型)等,甚至也可以是用戶自定義的類。不管是什么具體類型的對象,這些對象常常需要進行比較,打印等操作。整數類型的對象可以依據整數數值的大小進行比較,打印的內容也是該整數的數值。但是對一個用戶自定義的類怎樣才能具有可比較性?如何定義自定義類的打印內容?
在C++語言中對象的比較可以通過運算符重載實現,但是JAVA語言中沒有這樣的機制。在JAVA語言中有一個替代的方法是繼承Comparable定義的接口。用戶自定義的類通過實現Comparable接口的函數compareTo使得類的對象具有“可比較性”。該函數的返回值為整型,1表示大于,0表示相等,-1表示小于。對類的對象進行打印時,用戶可以選擇性地打印類中的一些信息,這可以通過重載函數toString來實現,該函數返回類型是String。在執行System.out.println()函數打印對象時,事實上打印的是該對象的toString函數的返回值。
這里以一個常見的類來解釋上面討論的“可比較性”和選擇打印過程。設計學生類,Student。包含學生的學號、年齡和成績信息。學生和學生之間有可能需要比較的對象為年齡或成績,這里考慮比較成績,即在事項compareTo函數時,將本學生的成績與另一個學生進行比價,若大于則返回1,小于則返回-1,等于則返回0。對一個學生對象進行打印時,可以選擇將學生的部分或者所有信息顯示出來,在toString函數中將需要顯示的信息返回即可。
下面是學生類Student的實現:
?
package?Element;/**
?*?學生類,用于測試ElemItem類的可比較性?Studnet.java
?*/
????public?class?Student?implements?Comparable{
????????private?int?ID;????????//學號
????????private?int?age;????//年齡
????????private?int?ave_score;????//平均分
????????public?Student(){//默認構造函數
????????????ID?=?-1;
????????????age?=?-1;
????????????ave_score?=?-1;
????????}
????????//有參數構造函數
????????public?Student(int?_id,?int?_age,?int?_ave_age){
????????????ID?=?_id;
????????????age?=?_age;
????????????ave_score?=?_ave_age;
????????}
????????//實現Comparable接口函數
????????//當前學生的成績比帶比較的學生的成績高時返回1,
????????//低時返回-1,相等時返回0
????????public?int?compareTo(Object?_student)?{
????????????Student?_s?=?(Student)(_student);
????????????return?(ave_score?>?_s.ave_score)?1:
????????????????((ave_score?<?_s.ave_score)??-1:0);
????????}
????????//獲取學生的信息
????????public?int?getID(){?return?ID;}
????????public?int?getAge()?{return?age;}
????????public?int?getAve_score()?{return?ave_score;}
????????
????????//打印的內容,打印學生的學號,年齡和成績
????????public?String?toString(){
????????????return?"Studnet?number?"?+?ID?+?",?age?"?+?
????????????age?+?",?aveage?score?"?+?ave_score;
????????}
????}
?
上面我們討論到,元素項類中的元素值必須具有可比較性,那么我們在定義泛型類型時可以加上這一限定,即泛型必須extends?Comparable<T>。此外,我們可以將元素項的元素值之間的比較再做一層封裝,封裝成元素項之間的比較,即在元素項類中設計一個成員函數來實現兩個元素項中的元素元素值的比較。
元素項類的JAVA語言設計:
?
/**????*?建立元素項類,這里采用Java泛型編程,并且泛型限制為
?????*?繼承了Comparable類的類型
?????*?泛型T可以是任意類型,包括整數Integer,Double等
?????*/
????package?Element;
????public?class?ElemItem<T??extends?Comparable<T>>?{
????????public?T?elem;????????????//泛型元素
????????public?ElemItem(){????????//默認構造函數
????????????elem?=?null;
????????}
????????public?ElemItem(T?t){????//含參數的構造函數
????????????elem?=?t;
????????}
????????
????????public?T?getElem(){????????//獲取元素
????????????return?elem;
????????}
????????//?元素項之間具有可比較性
????????public?int?compareTo(ElemItem<T>?oo){
????????????return?elem.compareTo(oo.elem);
????????}
????}
?
下面的例子中分別創建String、整數、雙精度類型以及上面我們自定義的Student類的元素項對象,用標準輸出流打印元素項的數據,并測試了學生類對象之間的比較。
?
package?Element;????
????/**
????*?ElemItem類的測試示例代碼,ExampleElemItem.java
?????*?測試類Integer,Double,String和Student類型的
?????*?ElemItem
?????*/
????public?class?ExampleElemItem?{
????????public?static?void?main(String?args[]){
????????????//字符串類型的元素項
????????????ElemItem<String>?elemString?=?
????????????????new?ElemItem<String>("String?type?elem?item");
????????????//整數類型的元素項
????????????ElemItem<Integer>?elemInt?
????????????????????=?new?ElemItem<Integer>(123);
????????????//Double型的元素項
????????????ElemItem<Double>?elemDouble?
????????????????????=?new?ElemItem<Double>(12.345);
????????????//打印各類元素項
????????????System.out.println(elemString.getElem().toString());
????????????System.out.println(elemInt.getElem());
????????????System.out.println(elemDouble.getElem());
????????????
????????????//?Student?類的測試示例
????????????//學生1,學號:1,年齡15,成績97
????????????ElemItem?S1?
????????????????=?new?ElemItem<Student>(new?Student(1,?15,?97));
????????????//學生2,學號:2,年齡16,成績95
????????????ElemItem?S2?
????????????????=?new?ElemItem<Student>(new?Student(2,?16,?95));
????????????System.out.println(S1.getElem());
????????????System.out.println(S2.getElem());
????????????int?cmp?=?S1.compareTo(S2);
????????????System.out.println("S1?比?S2成績"?+?
????????????????????(cmp>0?"高":(cmp<0?"低":"相同")));
????????????
????????}
????}
?
?
本示例程序首先創建三個ElemItem的對象,分別為String字符串類型,Integer整數類型和雙精度Double類型,調用系統函數println將這三個對象打印出來,事實上打印的是這三個對象的toString成員函數的返回值。然后創建兩個Student類型的ElemItem對象S1和S2,調用系統函數println打印這兩個對象,實際上也是打印的這兩個對象的toString成員函數的返回值,具體見Student類中的定義。最后比較這兩個對象,實際上在函數內部是調用Student類的compareTo函數進行學生成績的比較。
輸出結果:
String?type?elem?item
123
12.345
Studnet?number?1,?age?15,?aveage?score?97
Studnet?number?2,?age?16,?aveage?score?95
S1?比?S2成績高
在本系列接下來的幾章內容中,元素項將作為各種鏈表、樹、圖等數據結構中的基本元素,在討論具體內容時讀者將可以進一步了解到本節中設計的元素項的優勢。
轉載于:https://www.cnblogs.com/ajian005/archive/2012/11/08/2841167.html
總結
以上是生活随笔為你收集整理的0 开场白元素项类的设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html5 本地存储Web Storag
- 下一篇: 关于switch-case问题