如何在Java中对地图的键进行排序?

如何在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

这是一个非常基本的问题,我不太擅长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 contents, sorted by key. */
for (Map.Entry<String, ?> entry : map.entrySet()) {
  System.out.println(entry.getKey() + ": " + entry.getValue());
}

TreeMap
可以与实现
可比
接口的任何类型的键一起工作,将它们按“自然”顺序排列。对于不可比较的键,或者其自然顺序不是您所需要的,您可以实现自己的键,并在中指定。

您有几个选项。按优先顺序列出:

  • 使用a:
    SortedMap myNewMap=newtreemap(myOldMap)
    如果您想多次迭代,这是非常可取的。它会对键进行排序,这样您就不必在迭代之前对它们进行排序
  • 没有第二条
  • 也没有#3
  • 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());