如何在Java中对地图的键进行排序?
这是一个非常基本的问题,我不太擅长Java。我有一个地图,我想得到一个列表或一些按排序顺序排列的键,这样我就可以对它们进行迭代。使用a,这是如何在Java中对地图的键进行排序?,java,Java,这是一个非常基本的问题,我不太擅长Java。我有一个地图,我想得到一个列表或一些按排序顺序排列的键,这样我就可以对它们进行迭代。使用a,这是SortedMap接口的一个实现。它按排序顺序显示其键 Map<String, Object> map = new TreeMap<String, Object>(); /* Add entries to the map in any order. */ ... /* Now, iterate over the map's conte
SortedMap
接口的一个实现。它按排序顺序显示其键
Map<String, Object> map = new TreeMap<String, Object>();
/* Add entries to the map in any order. */
...
/* Now, iterate over the map's contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
TreeMap
可以与实现可比
接口的任何类型的键一起工作,将它们按“自然”顺序排列。对于不可比较的键,或者其自然顺序不是您所需要的,您可以实现自己的键,并在中指定。您有几个选项。按优先顺序列出:
SortedMap myNewMap=newtreemap(myOldMap)代码>
如果您想多次迭代,这是非常可取的。它会对键进行排序,这样您就不必在迭代之前对它们进行排序
SortedSet keys=new TreeSet(myMap.keySet())代码>
List keys=newarraylist(myMap.keySet());
集合。排序(键)代码>
最后两个选项可以满足您的需要,但仅当您只想迭代一次,然后忘记整个过程时才应使用。您可以在迭代时创建一个排序集合,但首先使用排序映射更有意义。(正如已经提出的那样) 尽管如此,这里是你如何做到这一点
Map<String, Object> map;
for(String key: new TreeSet<String>(map.keySet()) {
// accessed in sorted order.
}
Map;
for(字符串键:新树集(map.keySet()){
//按排序顺序访问。
}
除了其他答案中提到的方法外,对于Java 8 streams,从地图中获取排序键列表的另一种速记方法是-
List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());
List sortedKeys=myMap.keySet().stream().sorted().collect(Collectors.toList());
实际上,在
.sorted()
之后也可以完成工作(比如使用.map(…)
或.forEach(…)
),而不是在列表中收集它,然后在列表上迭代。我正在使用的代码为我提供了一个映射对象,那么我如何将其转换为树映射或使用树映射进行排序?您可以使用参数为任意映射的构造函数创建树映射。另外,祝贺erickson(我想,因为你离10k只有5次了)。你最好对键进行排序(放在树集中)然后在原始映射上调用get。创建一个新的树映射会导致所有内容都被重新设置。Steve,这是不正确的。树映射不会发生哈希;它是一个红黑树。无论如何,树集委托给一个内部树映射,因此创建一个树集,迭代其键,并使用它们执行O(log(n))在另一棵树中进行查找会造成混乱和效率低下。在步骤#4中,您还可以创建树集(排序集)而不是列表,这样可以避免显式调用sort()@David:我确实想到了,但出于某种原因,我忘了可以对集合进行迭代。不过每次都需要排序。嗯,我喜欢#4。为什么它需要比#1更多的排序?我会认为它同样需要排序good@litb:如果每次要在树状图上迭代时都将其转储到树状图中,则对,它们是一样的。如果您也需要映射中的值,那么#4不如#1好。对条目进行迭代可以节省对值的额外查找。
List<T> sortedKeys = myMap.keySet().stream().sorted().collect(Collectors.toList());