Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the previous key/value and the next key/value in Maps

for (Entry<Double, String> entry : map.entrySet()) { 
        Double key = entry.getKey(); 
        String value = entry.getValue(); 

        // double nextKey = ?
        // String nextvalue = ?

        // double prevKey = ?
        // String prevValue = ?
    } 

is it possible to know what the previous element and the next element while iterating the map?

like image 423
d_low Avatar asked May 07 '15 11:05

d_low


2 Answers

You can use NavigableMap for this, which entrySet()'s iterator return entries in ascending key order:

NavigableMap<Double, String> myMap = new TreeMap<>();

//...

for (Map.Entry<Double, String> e : myMap.entrySet()) {
    Map.Entry<Double, String> next = myMap.higherEntry(e.getKey()); // next
    Map.Entry<Double, String> prev = myMap.lowerEntry(e.getKey());  // previous

   // do work with next and prev
}

Every entry retrieval is O(logN), so for full iteration this is not the most effective approach. To be more effective, on iteration just remember last 3 entries, and use 1st as prev, 2nd as current and 3rd as next, as @Malt suggests.

like image 137
Alex Salauyou Avatar answered Oct 21 '22 03:10

Alex Salauyou


A TreeMap is an OrderedMap and a NavigableMap and will allow you to iterate forward and backward, allowing you to access previous and next keys with lowerKey() and higherKey() respectively. However it might not be the best solution.

Can you describe the actual problem you're trying to solve, and we can give you a more fitting solution?

like image 26
Kayaman Avatar answered Oct 21 '22 04:10

Kayaman