要有序可以用List,要便于查找可以用Map,那既要有序又便于查找呢?

        最近我就遇到了这样一个问题,Java没有给我们提供现成的类,我们完全可以自己开发个类继承List和Map(Java原来就有不可以同时继承List和Map的Bug,因此特意去看了下这个Bug的状态——Closed,呵呵,应该是很老的版本才有的问题,用新版本的朋友不用担心会遇到这个问题),但是完全没必要白花那个力气,因为Apache的Commons Collections的Jar包里已经为我们提供了一个相当完备的类来满足我们这样的要求完全是绰绰有余。因此我们现在要做的仅仅是引入Jar包,然后使用这个现成的好东西——ListOrderedMap就可以啦。

         让我们来看看代码:

ListOrderedMap list = new ListOrderedMap();
for(int i = 0; i < objs.length; i++{
    list.put(objs[i].getId(), objs[i]);
}

        初始化很简单吧,没有一点技术难度,往里边放数据和Map没一点区别,需要注意的是Map我们可以在初始化的时候加上类型,比如Map<String, String>,但是ListOrderedMap不可以,就这么点差别,要记得哦。但是这个差别也是ListOrderedMap让人最不满意的地方,因为这说明他是类型不安全的。

        接下来,看看我们都用到了ListOrderedMap的哪些方法:

int themeId = ((Obj) list.getValue(0)).getThemeId();
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);
}

        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