【问题标题】:Java container like c++ map像 c++ map 这样的 Java 容器
【发布时间】:2014-04-03 11:16:32
【问题描述】:

Java 中是否有任何容器允许我们按键使用迭代器,并且可以同时到达下一个元素和前一个元素(如 c++ 中的地图)?

附言对不起我的英语

【问题讨论】:

  • C++ 的map 是否保证任何迭代排序?这将在这里产生影响
  • @fge:是的。 std::map 基于给定的排序标准(默认为“小于”比较),按照键排序的顺序进行迭代。
  • 好的,那么@nosid 的回答符合要求
  • @fge:虽然也有std::unordered_map,它是基于哈希的,没有保证的迭代顺序。 (并且 OP 说“地图”不是 std::map,所以他也可能包括 std::unordered_map

标签: java c++ map iterator


【解决方案1】:

NavigableMap 最接近 std::map。最常用的实现是TreeMap

NavigableMap 包含许多按排序顺序遍历条目的方法。第一个循环遍历所有元素,而第二个循环被限制在一个子范围内。

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

也可以从开头迭代到某个入口,或者从某个入口迭代到结尾。看看以下方法:

在 C++ 中,迭代器 也用于许多其他用例。 Java 迭代器 非常不同,不能与变异操作结合使用。在许多情况下,您必须使用查找而不是迭代。例如,如果使用当前条目的键,则以下方法返回上一个和下一个条目(按排序顺序):

【讨论】:

    【解决方案2】:

    你可以看看at the official documentation 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());
        }
    }
    

    【讨论】:

      【解决方案3】:

      LinkedList 类有一个 listIterator 方法,可以帮助您双向遍历

      【讨论】:

      • 不仅LinkedList,而且any List 实现...问题是,Maps 不是Lists
      • 是的,只是举个例子。
      猜你喜欢
      • 2010-11-06
      • 2013-07-20
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多