【问题标题】:How to iterate over a TreeMap? [duplicate]如何遍历 TreeMap? [复制]
【发布时间】:2010-11-22 02:00:06
【问题描述】:

可能重复:
How do I iterate over each Entry in a Map?

我想遍历TreeMap,并且对于所有具有特定值的键,我希望将它们添加到新的TreeMap。我该怎么做?

【问题讨论】:

  • @Click: "...对于所有具有特定值的键..."。您是指给定 Set 中的所有键,还是满足给定谓词的所有键?

标签: java collections treemap


【解决方案1】:
    //create TreeMap instance
    TreeMap treeMap = new TreeMap();

    //add key value pairs to TreeMap
    treeMap.put("1","One");
    treeMap.put("2","Two");
    treeMap.put("3","Three");

    /*
      get Collection of values contained in TreeMap using
      Collection values()        
    */
    Collection c = treeMap.values();

    //obtain an Iterator for Collection
    Iterator itr = c.iterator();

    //iterate through TreeMap values iterator
    while(itr.hasNext())
      System.out.println(itr.next());

或:

   for (Map.Entry<K,V> entry : treeMap.entrySet()) {
        V value = entry.getValue();
        K key = entry.getKey();
   }

或:

   // Use iterator to display the keys and associated values
   System.out.println("Map Values Before: ");
   Set keys = map.keySet();
   for (Iterator i = keys.iterator(); i.hasNext();) {
     Integer key = (Integer) i.next();
     String value = (String) map.get(key);
     System.out.println(key + " = " + value);
   }

【讨论】:

  • 这里必须有一种更高效的方式来进行另一个树图查找:“(String) map.get(key)”。你已经知道这个阶段的元素,只是好奇。
【解决方案2】:

只是指出迭代任何地图的通用方法:

 private <K, V> void iterateOverMap(Map<K, V> map) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
        System.out.println("key ->" + entry.getKey() + ", value->" + entry.getValue());
    }
    }

【讨论】:

    【解决方案3】:

    使用Google Collections,假设 K 是您的密钥类型:

    Maps.filterKeys(treeMap, new Predicate<K>() {
      @Override
      public boolean apply(K key) {
        return false; //return true here if you need the entry to be in your new map
      }});
    

    如果您也需要该值,也可以使用 filterEntries

    【讨论】:

    • 这不做任何排序。
    【解决方案4】:

    假设类型 TreeMap

    for(Map.Entry<String,Integer> entry : treeMap.entrySet()) {
      String key = entry.getKey();
      Integer value = entry.getValue();
    
      System.out.println(key + " => " + value);
    }
    

    (key 和 Value 类型当然可以是任何类)

    【讨论】:

    • 仅供参考,EntrySet 是遍历任何 Map 的首选方式,因为 EntrySet 具有规范反射性,并且始终表示 Map 中数据的状态,即使下面的 Map 会发生变化。
    • 添加到 Zed 的答案中,使用 entrySet 将赋予用户在迭代时删除特定条目的权力。
    • 把名字 treeMap 给你的 TreeMap 起初让我失望。
    • 这会给出排序的值吗?
    • 没有。 TreeMap 按键值排序。
    猜你喜欢
    • 2013-08-11
    • 2017-12-10
    • 2017-10-10
    • 2012-11-12
    • 2021-11-29
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多