问题描述:

Are there any containers in Java which allows us to use iterator by key and which can go both to the next element and to the previous one (like maps in c++)?

p.s. sorry for my English

网友答案:

A NavigableMap comes closest to std::map. The most commonly used implementation is TreeMap.

The NavigableMap contains a lot of methods to iterate in sorted order over the entries. The first loop iterates over all elements, whereas the second loop is restricted to a sub-range.

NavigableMap<String, Integer> map = ...;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    // ...
}
for (Map.Entry<String, Integer> entry
   : map.subMap("bar", "foo").entrySet()) {
    // ...
}

It is also possible to iterate from the beginning to a certain entry, or from a certain entry to the end. Take a look at the following methods:

  • subMap
  • headMap
  • tailMap

In C++, iterators are also used for a lot of other use cases. The Java iterators are very different, and can not be used in combination with mutating operations. In many cases, you have to use lookups by instead of iterations. For example, the following methods return the previous and next entry (in sorted order), if the key of the current entry is used:

  • lowerEntry
  • higherEntry
网友答案:

You can have a look at the official documentation here

I think you can use an iterator to traverse on the map's keyset to achieve what you want. Sample code here:

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class Test {

public static void main(String[] args) {

    Map<Integer, String> map = new HashMap<Integer, String>() {
        {
            put(1, "One");
            put(2, "Two");
            put(3, "Three");
            put(4, "Four");
            put(5, "Five");
        }
    };


    Iterator<Integer> iter = map.keySet().iterator();

    while(iter.hasNext()){
        System.out.println(iter.next());
    }
}
网友答案:

The LinkedList class has a listIterator method which helps you to traverse in both directions

相关阅读:
Top