1.概述

Apache Commons Collections库提供有用的类来补充Java集合框架。

在本文中,我们将回顾该接口OrderedMap.,扩展了java.util.Map

2. Maven依赖

我们需要做的第一件事是添加我们的Maven依赖pom.xml:

<依赖>  org.apache.commons   Commons-CollectionS4   4.1  

您可以在网站上找到库的最新版本Maven中央存储库

3.OrderedMap.属性

控件实现的映射OrderedMap.接口:

  • 维护其键集的顺序,尽管该键集没有排序
  • 可以用方法在两个方向上迭代:FirstKey()nextKey (),或lastKey ()previousKey ()
  • 可以遍历一个MapIterator(由图书馆提供)
  • 提供查找、修改、删除或替换元素的方法

4.使用OrderedMap.

让我们建立一个OrderedMap.跑步者及其年龄在一个测试课上。我们将使用一个LinkedMap- 其中一个OrderedMap.图书馆提供的实现。

首先,让我们建立一个跑步者和年龄的数组,我们将使用它来加载映射并验证值的顺序:

公共类ordermapunittest {私有字符串[]名称= {emily“,”mathew“,”玫瑰“,”约翰“,”安娜“};私有整数[]年代= {37,28,40,36,21};private linkedmap  runnerslinkedmap;// ......}

现在,让我们初始化我们的map:

@Before public void createrunners(){this.runnerslinkedmap = new linkedmap <>();for(int i = 0; i 

4.1。提出迭代

让我们看看前向迭代器是如何使用的:

@Test public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() {String name = this.runnersLinkedMap.firstKey();Int I = 0;while (name != null) {assertEquals(name, names[i]);name = this.runnersLinkedMap.nextKey(名称);我+ +;}}

注意,当我们到达最后一个键时,方法nextKey ()将返回A.空值价值。

4.2。向后迭代

现在让我们迭代,从最后一个关键开始:

@Test public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() {String name = this.runnersLinkedMap.lastKey();int i = RUNNERS_COUNT - 1;while (name != null) {assertEquals(name, this.names[i]);name = this.runnersLinkedMap.previousKey(名称);我,;}}

一旦我们拿到了第一把钥匙previousKey ()方法将返回null。

4.3。MapIterator例子

现在让我们使用mapIterator ()获得a的方法MapIterator正如我们展示它如何保留在数组中定义的跑步者的顺序名称:

@Test public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() {OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator();Int I = 0;while (runnersIterator.hasNext()) {runner runner .next();assertequal (runnersIterator.getKey (), this.names[我]);assertequal (runnersIterator.getValue (), this.ages[我]);我+ +;}}

4.4。删除元素

最后,让我们看看如何做可以通过索引或对象删除元素:

@test public voidedaLinkedmap_whenelementremoved_thensizeCrease(){linkedmap  lmap =(linkedmap )this.runnerslinkedmap;整数johnage = lmap.remove(“John”);assertequals(Johnage,新整数(36));assertequals(lmap.size(),runners_count  -  1);整数emilyage = lmap.remove(0);assertequals(emilyage,新整数(37));assertequals(lmap.size(),runners_count  -  2);}

5.提供实现

目前,在图书馆版本4.1中,有两种实现OrderedMap.界面,ListOrderedMapLinkedMap

ListOrderedMap方法跟踪键集的顺序java.util.list.。它是一个装饰家OrderedMap.并且可以从任何一个创造地图通过使用静态方法listorderedmap.decorate(地图地图)

LinkedMap是基于一个Hashmap.并通过允许双向迭代和其他方法来改善它OrderedMap.接口。

类之外的三个方法OrderedMap.接口:

  • Aslist()-获取类型列表< K >列表(K键的类型)保持映射的顺序吗
  • get (int指数)-获取元素的位置指数与方法相反get(对象o)接口中提供
  • o indexOf(对象)- 获取对象的索引o在有序地图

我们可以对OrderedMap.进入A.LinkedMap使用Aslist()方法:

@Test public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() {LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;List listKeys = new ArrayList<>();listKeys.addAll (this.runnersLinkedMap.keySet ());List linkedMap = lmap.asList();assertequal (listKeys linkedMap);}

然后我们可以检查方法的运作o indexOf(对象)get (int指数)在里面LinkedMap实现:

@Test public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() {LinkedMap lmap = (LinkedMap) this.runnersLinkedMap;For (int I = 0;我< RUNNERS_COUNT;i++) {String name = lmap.get(i);assertequal(名称、this.names[我]);assertequal (lmap.indexOf (this.names[我]),i);}}

六,结论

在这个快速教程中,我们回顾了OrderedMap.接口及其主要方法和实现。

有关详细信息,请参阅Apache Commons Collections库的JavaDoc

与往常一样,本文的完整测试类包含使用这两种方法的类似测试用例LinkedMapListOrderedMap并可从GitHub项目

下一个»
Apache Commons Collections BidiMap
«以前的
Apache Commons Collections SetUtils
通用的底部

开始使用Spring 5和Spring Boot 2,通过学习春天课程:

>>查看课程
对这篇文章的评论关闭!