要有序可以用List,要便于查找可以用Map,那既要有序又便于查找呢?
最近我就遇到了這樣一個問題,Java沒有給我們提供現成的類,我們完全可以自己開發個類繼承List和Map(Java原來就有不可以同時繼承List和Map的Bug,因此特意去看了下這個Bug的狀態——Closed,呵呵,應該是很老的版本才有的問題,用新版本的朋友不用擔心會遇到這個問題),但是完全沒必要白花那個力氣,因為Apache的Commons Collections的Jar包里已經為我們提供了一個相當完備的類來滿足我們這樣的要求完全是綽綽有余。因此我們現在要做的僅僅是引入Jar包,然后使用這個現成的好東西——ListOrderedMap就可以啦。
讓我們來看看代碼:






初始化很簡單吧,沒有一點技術難度,往里邊放數據和Map沒一點區別,需要注意的是Map我們可以在初始化的時候加上類型,比如Map<String, String>,但是ListOrderedMap不可以,就這么點差別,要記得哦。但是這個差別也是ListOrderedMap讓人最不滿意的地方,因為這說明他是類型不安全的。
接下來,看看我們都用到了ListOrderedMap的哪些方法:











getValue(int index)直接根據Index取得Value,當然也可以直接根據Index取得Key值,方法名可不是getKey(int index),而是直接get(int index)就可以啦。接著我們想取到當前Key值后面一個Key值所對應的Value,首先用indexOf(Object key)取得Index,然后計算其后面的Index再根據此Index取值。如果想取得當前Key值后面一個Key值,則不必要先取Index,這么麻煩,ListOrderedMap里有直接的方法可以取得當前Key值的前一個Key值和后一Key值,分別是previousKey(Object key)方法和nextKey(Object key)方法,返回null值表示到頭(或尾)了,或者沒有找到和當前Key值匹配的Key值 。個至于這邊為什么要有If和Else if,原因很簡單,和一般的索引一樣,返回值是-1就表示沒有找到。我們在這里做了一個循環,而且我的這個ListOrderedMap的數列是確保長度大于0的,所以我把index==list.size()-1的判斷放在了前邊,如果不能確定長度是否大于0,還是先判斷返回值是否為-1為好。
本文只簡單介紹了ListOrderedMap的幾種比較實用的方法,其他方法使用方法可以參考Apache網站上的相關API:http://commons.apache.org/collections/api-release/index.html
LinkedHashMap在做根據一個Key值取下一個Key值Value的時候也只有取出所有Key值借助于Iterator做循環,并不能簡單解決上邊提到的問題啊。
int index = list.indexOf(key);
if (index == list.size() - 1) {
obj= (Obj) list.getValue(0);
} else if (index != -1) {
obj= (Obj) list.getValue(index + 1);
}
能說的具體點嗎?
Obj是一個自定義的數據結構類,只提供基本的Get和Set方法,結構類似于:
public class Obj{
private int themeId;
...
public Obj() {}
public int getThemeId () {
return themeId ;
}
public void setThemeId (int themeId ) {
this.themeId = themeId ;
}
...
}
//根據索引獲得ListOrderedMap中的第一個對象,由于ListOrderedMap不是類型安全的,所以我們要先進行強制類型轉換,然后才能用Get方法取得該對象的themeId的值
int themeId = ((Obj) list.getValue(0)).getThemeId();
//根據已有的鍵值取得其所在的索引位置
int index = list.indexOf(key);
//判斷該索引的值是否已到list的末尾(可以先做此判斷的前提是:list的大小是確保大于0的)
if (index == list.size() - 1) {
//取得list的第一個索引對象
obj= (Obj) list.getValue(0);
//判斷該索引是否有效
} else if (index != -1) {
//取得list的下一個索引對象
obj= (Obj) list.getValue(index + 1);
}