In this tutorial, we are going to help you understand TreeMapas an implementation of NavigableMap interface. As you know in the SortedMap and TreeMap tutorial, besides Map and SortedMap, the TreeMap class also implements the NavigableMap interface.

Now we go deeper to understand this interface in the Java Collections Framework.

 

1. Understanding NavigableMap

NavigableMap is sub interface of SortedMap interface, so it inherits all behaviors of a sorted map like range view, endpoints and comparator access operations. In addition, the NavigableMap interface provides navigation methods and descending views similar to NavigableSet. And due to the nature of a map which stores key-value mappings, the additional APIs are designed for both keys and key-value entries in the map.

Let’s look at these methods in details.

 

Operations on key-value mappings (entries):

Note that all these methods return null if there is no such key.

 

Operations on keys only:

Note that all these methods return null if there is no such key.



Furthermore, the NavigableMap interface overloads the headMap(), subMap() and tailMap() methods of the SortedMap interface, which accept additional arguments describing whether lower or upper bounds are inclusive versus exclusive:

Now, let’s look at some code examples.

 

2. NavigableMap Examples with TreeMap

The following example shows us how to obtain the reverse order view of the keys in a map:

NavigableMap<Integer, String> mapHttpStatus = new TreeMap<>();

mapHttpStatus.put(100, "Continue");
mapHttpStatus.put(200, "OK");

mapHttpStatus.put(400, "Bad Request");
mapHttpStatus.put(401, "Unauthorized");

mapHttpStatus.put(500, "Internal Server Error");
mapHttpStatus.put(501, "Not Implemented");


Set<Integer> ascendingKeys = mapHttpStatus.keySet();

System.out.println("Ascending Keys: " + ascendingKeys);

Set<Integer> descendingKeys = mapHttpStatus.descendingKeySet();

System.out.println("Descending Keys: " + descendingKeys);
Output:

Ascending Keys: [100, 200, 400, 401, 500, 501]
Descending Keys: [501, 500, 401, 400, 200, 100]
 

Given the above map, the following code snippet gets a reverse order view of the map:

NavigableMap<Integer, String> descendingMap = mapHttpStatus.descendingMap();

for (Integer key : descendingMap.keySet()) {
	System.out.println(key + " => " + descendingMap.get(key));
}
Output:

501 => Not Implemented
500 => Internal Server Error
401 => Unauthorized
400 => Bad Request
200 => OK
100 => Continue
Using operations on keys is explained in the following example:

Integer lowerKey = mapHttpStatus.lowerKey(401);
System.out.println("Lower key: " + lowerKey);

Integer floorKey = mapHttpStatus.floorKey(401);
System.out.println("Floor key: " + floorKey);

Integer higherKey = mapHttpStatus.higherKey(500);
System.out.println("Higher key: " + higherKey);

Integer ceilingKey = mapHttpStatus.ceilingKey(500);
System.out.println("Ceiling key: " + ceilingKey);
Output:

Lower key: 400
Floor key: 401
Higher key: 501
Ceiling key: 500
And the following example demonstrates how to work with operations on key-value mapping entries:

Map.Entry<Integer, String> firstEntry = mapHttpStatus.firstEntry();

System.out.println("First entry: " + firstEntry.getKey() + " => " + firstEntry.getValue());

Map.Entry<Integer, String> lastEntry = mapHttpStatus.lastEntry();

System.out.println("Last entry: " + lastEntry.getKey() + " => " + lastEntry.getValue());

Map.Entry<Integer, String> lowerEntry = mapHttpStatus.lowerEntry(401);
System.out.println("Lower entry: " + lowerEntry.getKey() + " => " + lowerEntry.getValue());

Map.Entry<Integer, String> floorEntry = mapHttpStatus.floorEntry(401);
System.out.println("Floor entry: " + floorEntry.getKey() + " => " + floorEntry.getValue());

Map.Entry<Integer, String> higherEntry = mapHttpStatus.higherEntry(500);
System.out.println("Higher entry: " + higherEntry.getKey() + " => " + higherEntry.getValue());

Map.Entry<Integer, String> ceilingEntry = mapHttpStatus.ceilingEntry(500);
System.out.println("Ceiling entry: " + ceilingEntry.getKey() + " => " + ceilingEntry.getValue());

mapHttpStatus.pollFirstEntry();
mapHttpStatus.pollLastEntry();


System.out.println("\nMap after first and last entries were polled:");

for (Integer key : mapHttpStatus.keySet()) {
	System.out.println(key + " => " + mapHttpStatus.get(key));
}
Output:

First entry: 100 => Continue
Last entry: 501 => Not Implemented
Lower entry: 400 => Bad Request
Floor entry: 401 => Unauthorized
Higher entry: 501 => Not Implemented
Ceiling entry: 500 => Internal Server Error

Map after first and last entries were polled:
200 => OK
400 => Bad Request
401 => Unauthorized
500 => Internal Server Error
That’s all about TreeMap as an implementation of the NavigableMap interface.

 

API References:

 

Related Java Map tutorials:

 

Other Java Collections Tutorials:


About the Author:

is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.



Attachments:
Download this file (NavigableMapTreeMapExample.java)NavigableMapTreeMapExample.java[Java NavigableMap with TreeMap Code Examples]3 kB