ListOrderedMap

要有序能够用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 <</SPAN> objs.length; i++) {
 list.put(objs[i].getId(), objs[i]);
 
}

初始化非常easy吧,没有一点技术难度。往里边放数据和Map没一点区别,须要注意的是Map我们能够在初始化的时候加上类型,比方Map。可是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,原因非常easy。和一般的索引一样,返回值是-1就表示没有找到。我们在这里做了一个循环,并且我的这个ListOrderedMap的数列是确保长度大于0的,所以我把index==list.size()-1的推断放在了前边,假设不能确定长度是否大于0。还是先推断返回值是否为-1为好。

本文仅仅简介了ListOrderedMap的几种比較有用的方法。其它方法用法能够參考Apache站点上的相关API:http://commons.apache.org/collections/api-release/index.html

原文地址:https://www.cnblogs.com/mfrbuaa/p/5350187.html