为什么可以';我们是否只使用其迭代器或for each循环按顺序访问java映射(HashMap或TreeMap)中的值?
我是Java的初学者。请尽可能解释清楚。 我在写一个伪代码,因为这个网站不允许我在没有以下内容的情况下发布问题:为什么可以';我们是否只使用其迭代器或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
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似乎只关心迭代的方法,而不关心顺序是什么。