?

自定義對象作為Properties的鍵進行中文排序的算法實現研究

2013-03-20 07:18馬會成
科技視界 2013年10期
關鍵詞:實例排序對象

馬會成

(1.寧夏職業技術學院,寧夏 銀川750002;2.寧夏廣播電視大學,寧夏銀川750002)

1 properties概述

在java.util數據包里有一個 Properties類,它是JAVA集合類中的一個保存數據的類,通常用于處理軟件項目中的配置文件,Properties對象中的每一個數據保存的是一個鍵值對,鍵和值是一一對應關系,而且鍵必須是唯一的,否則就會發生數據覆蓋,也就是說,如果鍵出現了重復,那么后保存的數據就會覆蓋以前保存的相同鍵對應的數據。

Properties類能夠處理數據項對應的屬性,而且它具有持久性,屬性的每個鍵和值可以是自定義對象,也可以是字符串,但更常見的是字符串,它既可以保存在流中也可以從流中加載,既可以在一個屬性列表中設定它的“默認值”,也可以讓另一個屬性列表作為它的“默認值”,Properties類的自動同步功能和 它的setProperty方法提供的處理字符串的安全性,這些方便的功能使得在軟件項目中得到了越來越多的應用。

需要注意的是,由于Properties類是從Hashtable繼承而來,因而可以對Properties的對象應用Hashtable中的put和putAll方法,但是不建議使用put和putAll方法,因為它們允許調用者插入其鍵或值不是 String的項,這將導致軟件和項目的安全性受到影響,建議使用setProperty方法。如果要使用Properties中的store、propertyNames、save、list方法,那么Properties對象中屬性必須是String類型的鍵和值。

Properties類雖然支持中文排序,但是它的局限性在于需要開發人員自行設計算法,并手工完成一些代碼,而且它沒有提供對自定義對象的排序算法及其實現,將自定義對象作為Properties的鍵進行中文排序的算法,將會使得Properties類的方便性和實用性得到進一步的擴展。

Properties類還有一種局限,那就是它既沒有提供按指定的屬性對自定義對象進行排序的算法,也沒有提供可以直接對自定義對象進行排序的具體實現,因而,Properties類按指定的屬性對自定義對象進行排序的相關算法及其實現,將使Properties類的功能得到進一步發展和完善。

2 自定義對象作為Properties的鍵進行中文排序的算法實現研究

自定義對象作為Properties的鍵按鍵進行排序時,可以使用自定義對象的某個屬性值作為Properties的鍵,也可以使用將整個自定義對象作為Properties的鍵,而且通常排序還有正向排序和反向排序之分,排序字符串也有中文和英文之分,現將自定義對象作為Properties的鍵進行中文排序的算法概述如下:

2.1 將自定義對象中用于排序的屬性作為Properties的鍵,并對鍵按中文正向進行排序

如果你只關心一個自定義對象的一個屬性或者值并對其使用排序,且用于排序的屬性不會重復,那么可以將該屬性用于Properties的鍵,如果屬性值重復,那么后出現的屬性值將覆蓋前面的出現的屬性值,而不用將整個自定義對象保存到Properties中,比如,有一個學生類,其中的學號不可能重復,所以學號可以做為Properties的鍵,并可以按學號進行排序,基本實現算法如下:

①由于是自定義對象的排序,所以首先要有一個類,這樣才能生成自定義對象,比如學生類,在類中提供學號、姓名等屬性。

②由于是對自定義對象的屬性進行排序,所以需要先寫一個類CollatorComparator,且該類要實現Comparator接口。在該類中要提供一個方法compare,用于處理自定義對象中按指定的屬性進行排序。

③用自定義類生成自定義對象,并進行初始化,然后用Properties類生成一個對象defList,并用生成的對象defList通過setProperty方法將自定義對象的屬性作為鍵和值對defList進行初始化。注意,這里排序關鍵字不能重復,如果重復,將覆蓋前面的有相同屬性的對象,除非預知此結果,否則請不要使用此種覆蓋。

④用上面自己寫的類CollatorComparator生成一個對象的實例comparator。

⑤用new ArrayList(defList.entrySet())生成一個實例,并保存到List類的對象list1中。

⑥用 Collections.sort(list1,comparator);實現對對象 list1按comparator的規則進行排序。

⑦用List類的對象list1調用iterator(),并保存到Iterator類的對象i中。

⑧然后用一個循環處理Properties的鍵和值,這里要注意鍵和值的對應關系,可以使用i.next()得到下一個鍵,并轉換成Map.Entry的類的對象,同時保存到Map.Entry的對象me中,這樣me.getKey()保存的就是Properties的當前正在處理的鍵,而me.getValue()就是對應鍵的值。

上面在Properties中保存的都是對象的部分值,這樣是為了方便按鍵的排序,如果想在Properties中保存完整的對象,那么就可以按對象的任何一個屬性進行排序。

2.2 將整個自定義對象作為Properties的鍵,并對鍵按指定的屬性進行中文正向排序

將自定義對象中用于排序的屬性作為Properties的鍵,往往存在著屬性值的重復問題,為了解決這個問題,可以將整個自定義對象作為Properties的鍵,這樣只要自定義對象不同,不管他們用于排序的屬性值是否相同,都可以將自定義對象作為Properties的鍵,并可以按需要的屬性進行排序,但是需要注意的是,如果自定義對象相同,那么后出現的對象將覆蓋前面出現過的對象。這種方案比較器兩個參數的類型常有兩種:Object和Map.Entry型,這里先看Object型。

●比較器兩個參數的類型使用Object型,基本實現算法如下:

①由于是自定義對象的排序,所以首先要有一個類,這樣才能生成自定義對象,比如Person類,在類中提供年齡、姓名等屬性。

②由于是將整個自定義對象作為Properties的鍵,而且只是對自定義對象的屬性進行排序,所以需要先寫一個類CollatorComparator,且該類要實現Comparator接口。在該類中要提供一個方法compare,用于處理自定義對象中按指定的屬性進行排序,該類的主要代碼如下:

Collator collator=(RuleBasedCollator)java.text.Collator.getInstance (java.util.Locale.CHINA);

注意,上面的代碼由于用了toString(),所以什么類型都可以比較如int型。使用此法時,如果不區分大小寫,只需要在這兩個toString()后加上.toLowerCase(),或者用.toUpperCase()。如果要反向排序,只需要在key1前加負號。

③用自定義類生成自定義對象,并進行初始化,然后用Properties類生成一個對象defList,并用生成的對象defList通過put方法將自定義對象的屬性作為鍵和值對defList進行初始化。注意,這里排序關鍵字的值可以重復,而且只要自定義對象不重復,即使排序屬性值重復也不存在導致覆蓋的問題。

④用上面自己寫的類 CollatorComparator一個對象的實例comparator。

⑤用Properties類生成的對象defList調用keySet()中的toArray()方法,并保存到Object型的數組key中。

⑥用Arrays.sort(key,comparator)對數組key按comparator規則進行排序。

⑦然后用一個循環處理Properties的鍵和值,這里要注意鍵和值的對應關系,(Person)key[i]保存的就是Properties的當前正在處理的鍵,而defList.get(key[i])就是對應鍵的值。

上面的方法在比較器的參數是兩個Object直接轉換成Person對象,這就要求比較時將比較器用于裝有Person對象的容器,這只是方法中的一種.

當然我們也可以將比較器的兩個參數的Object轉換成Properties操作需要的Map.Entry型,這就要求比較時將比較器用于裝有鍵值的Properties對象,然后對person類的屬性name進行排序(包括中英文)。

●比較器兩個參數的類型使用Map.Entry型,基本實現算法如下:

①由于是自定義對象的排序,所以首先要有一個類,這樣才能生成自定義對象,比如Person類,在類中提供年齡、姓名等屬性。

②由于是將整個自定義對象作為Properties的鍵,而且只是對自定義對象的屬性進行排序,所以需要先寫一個類CollatorComparator,且該類要實現Comparator接口。在該類中要提供一個方法compare,用于處理自定義對象中按指定的屬性進行排序,該類的主要代碼如下:

Collator collator=(RuleBasedCollator)java.text.Collator.getInstance (java.util.Locale.CHINA);

注意,上面的代碼由于用了toString(),所以什么類型都可以比較如int型。使用此法時,如果不區分大小寫,只需要在這兩個toString()后加上.toLowerCase(),或者用.toUpperCase()。如果要反向排序,只需要在key1前加負號。

③用自定義類生成自定義對象,并進行初始化,然后用Properties類生成一個對象defList,并用生成的對象defList通過put方法將自定義對象的屬性作為鍵和值對defList進行初始化。注意,這里排序關鍵字的值可以重復,而且只要自定義對象不重復,即使排序屬性值重復也不存在導致覆蓋的問題。

④用上面自己寫的類 CollatorComparator一個對象的實例comparator。

⑤用new ArrayList(defList.entrySet())生成一個實例,并保存到List類的對象list1中。

⑥用 Collections.sort(list1,comparator);;實現對對象 list1按comparator的規則進行排序。

⑦用List類的對象list1調用iterator(),并保存到Iterator類的對象i中。

⑧然后用一個循環處理Properties的鍵和值,這里要注意鍵和值的對應關系,可以使用i.next()得到下一個鍵,并轉換成Map.Entry的類的對象,同時保存到Map.Entry的對象me中,這樣(Person)me.getKey()保存的就是Properties的當前正在處理的鍵即整個自定義對象,而me. getValue()就是對應鍵的值。

在實際使用中,將自定義對象作為Properties的值的情況更為常見,因為自定義對象作為Properties的鍵時,如果自定義對象相同,會有覆蓋的情況,而做為值就不會出現覆蓋的情況,而且用值時對其中的相關屬性排序時控制更方便。

[1][美]Robert Lafore.Java數據結構和算法[M].

[2]sun公司官方網站.JDK幫助文檔[OL].

猜你喜歡
實例排序對象
神秘來電
排序不等式
恐怖排序
基于熵的快速掃描法的FNEA初始對象的生成方法
區間對象族的可鎮定性分析
完形填空Ⅱ
完形填空Ⅰ
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合