为什么可以';我们是否只使用其迭代器或for each循环按顺序访问java映射(HashMap或TreeMap)中的值?

为什么可以';我们是否只使用其迭代器或for each循环按顺序访问java映射(HashMap或TreeMap)中的值?,java,dictionary,hashmap,treemap,Java,Dictionary,Hashmap,Treemap,我是Java的初学者。请尽可能解释清楚。 我在写一个伪代码,因为这个网站不允许我在没有以下内容的情况下发布问题: public void printSorted(PrintStream out) { TreeMap<Integer,String> map2 = new TreeMap<Integer,String>(); for(Map.Entry<String,Integer> entry : concord.entrySet

我是Java的初学者。请尽可能解释清楚。 我在写一个伪代码,因为这个网站不允许我在没有以下内容的情况下发布问题:

public void printSorted(PrintStream out) {
        TreeMap<Integer,String> map2 = new TreeMap<Integer,String>();
        for(Map.Entry<String,Integer> entry : concord.entrySet()){
            map2.put(entry.getValue(), entry.getKey());
        }//NavigableMap nmap=treemap.descendingMap();
        for(Map.Entry<Integer,String> entry2 : map2.descendingMap().entrySet()){
            System.out.println(entry2.getValue()+ " " + entry2.getKey());
        }


    }
public void打印排序(打印流输出){
TreeMap map2=新的TreeMap();
对于(Map.Entry:concord.entrySet()){
put(entry.getValue(),entry.getKey());
}//NavigableMap nmap=treemap.downingmap();
对于(Map.Entry entry2:map2.dressingmap().entrySet()){
System.out.println(entry2.getValue()+“”+entry2.getKey());
}
}
为什么我们不能使用它的迭代器或for-each循环按顺序访问java映射(HashMap或TreeMap)中的值

因为这两个类不以任何顺序维护值。(除了
TreeMap
案例中的键的隐含顺序…)

实际上,
Map
的值类型甚至不要求它是可订购的

如果您希望/需要地图的值,请按顺序:

  • 如果您想要的顺序是“条目插入顺序”或“最近使用最少的条目”,则使用
    LinkedHashMap

  • 对于其他排序,可以将值列表(或条目集)复制到单独的集合中,然后对其进行排序。(或者您可以在没有显式副本的情况下对流执行等效操作。)但关键是
    映射本身不会/无法维持您刚才通过排序创建的顺序

  • 若要避免重复排序的成本,请使用单独的(可增量更新的)数据结构来保存已排序的列表或值集


另外,如果您实际上是询问如何按顺序迭代键或条目,那么
TreeMap
已经这样做了。而且

为什么我们使用映射迭代器而不使用for/each循环

我们两者都可以。两者都有效。事实上,for-each循环在幕后使用迭代器


如果要显式调用迭代器上的方法,只需显式使用迭代器;e、 g.
Iterator::remove()

请添加有关该问题的更多详细信息。您试图实现什么,您希望通过上述代码看到什么(尽管可能是示例),以及您实际看到了什么?…根据定义,
HashMap
,没有任何顺序。@AndyTurner,除非它是
LinkedHashMap
。但您的两个示例都显示了对每个循环使用a。您发布的两个循环都是foreach循环。迭代
TreeMap
将“按顺序”迭代值,即按照键的顺序,自然的或由
Comparator
定义的键的顺序进行迭代@Andreas-我知道。但这不是这个问题的核心。这是关于迭代值。。。不是键。因此,
for(X:map.values())
将按照映射定义的顺序迭代这些值。问题中没有提到OP希望按值的排序顺序迭代值。注释中的后续问题(“为什么我们使用Map迭代器而不使用for/each循环?”)甚至与此相去甚远,因为OP似乎只关心迭代的方法,而不关心顺序是什么。