如何在Java中使用SortedMap接口?


70

我有一个

 Map<Float, MyObject>

保持地图根据浮动量排序的最佳方法是什么?

SortedMap最好的答案?TreeMap?如何使用?

我只创建一次地图,并替换了MyObject经常使用的myMap.put()myMap.get()


但是SortedMap是一个接口。TreeMap实现SortedMap。
史密斯先生

请参阅@user157196此处发布的答案stackoverflow.com/questions/109383/…–
位图

寻找汤姆·杰弗里斯(Tom Jefferys)的答案
JohnnyLambada 2014年

仅供参考,NavigableMapJava 6中添加了FYI,以取代旧版本SortedMap
罗勒·布尔克

Answers:


93

我会用TreeMap,实现SortedMap。它正是为此目的而设计的。

例:

Map<Integer, String> map = new TreeMap<Integer, String>();

// Add Items to the TreeMap
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

// Iterate over them
for (Map.Entry<Integer, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + " => " + entry.getValue());
}

有关SortedMap的信息,请参见Java教程页面
这里的教程列表相关TreeMap的。


为什么要这样做new Integer(n)而不仅仅是裸整数?
Adam_G

@Adam_G没有特殊原因,我想我写这个答案的时候并不习惯自动装箱(?)。
Barth

46

TreeMap可能是最简单的方法。您可以像正常地图一样使用它。即

Map<Float,String> mySortedMap = new TreeMap<Float,MyObject>();
// Put some values in it
mySortedMap.put(1.0f,"One");
mySortedMap.put(0.0f,"Zero");
mySortedMap.put(3.0f,"Three");

// Iterate through it and it'll be in order!
for(Map.Entry<Float,String> entry : mySortedMap.entrySet()) {
    System.out.println(entry.getValue());
} // outputs Zero One Three 

值得一看一下API文档http://download.oracle.com/javase/6/docs/api/java/util/TreeMap.html,以了解您还可以做什么。


16

您可以使用TreeMap在内部实现SortedMap的示例如下

按升序排序:

  Map<Float, String> ascsortedMAP = new TreeMap<Float, String>();

  ascsortedMAP.put(8f, "name8");
  ascsortedMAP.put(5f, "name5");
  ascsortedMAP.put(15f, "name15");
  ascsortedMAP.put(35f, "name35");
  ascsortedMAP.put(44f, "name44");
  ascsortedMAP.put(7f, "name7");
  ascsortedMAP.put(6f, "name6");

  for (Entry<Float, String> mapData : ascsortedMAP.entrySet()) {
    System.out.println("Key : " + mapData.getKey() + "Value : " + mapData.getValue());
  }

按降序排序:

如果您始终希望此创建图通常使用降序排列,那么如果只需要一次,则创建一个具有降序排列的TreeMap并将原始地图中的所有数据放入其中。

  // Create the map and provide the comparator as a argument
  Map<Float, String> dscsortedMAP = new TreeMap<Float, String>(new Comparator<Float>() {
    @Override
    public int compare(Float o1, Float o2) {
      return o2.compareTo(o1);
    }
  });
  dscsortedMAP.putAll(ascsortedMAP);

有关SortedMAP的更多信息,请阅读http://examples.javacodegeeks.com/core-java/util/treemap/java-sorted-map-example/


2
我更喜欢这个答案,因为它正在通过使用Comparator来实现SortedMap的设计目的
CodeToLife

3

TreeMap是SortedMap接口的实现,可以使用。

如何使用?

Map<Float, MyObject> map = new TreeMap<Float, MyObject>();

2

TreeMap按键自然顺序排序。密钥应实现Comparable或与密钥兼容Comparator(如果您将一个实例传递给构造函数)。对于您而言,Float已经实现了,Comparable因此您无需执行任何特殊操作。

您可以调用keySet以升序检索所有键。


0

tl; dr

使用Map与Java 6及更高版本捆绑在一起的任一实现NavigableMap(的后继SortedMap):

  • 使用TreeMap如果运行单线程的,如果映射是只读跨线程首先被填充后。
  • ConcurrentSkipListMap如果在多个线程之间操作映射,请使用。

NavigableMap

仅供参考,该SortedMap界面是由NavigableMap接口。

SortedMap当使用尚未声明其支持的3rd-party实现时,才需要使用NavigableMap。与Java捆绑在一起的地图中,实现的两个实现SortedMap也都实现了NavigableMap

界面与具体课程

s SortedMap的最佳答案?树图?

正如其他人提到的,SortedMap是接口,而是该接口TreeMap的多个实现之一(以及最近的实现)NavigableMap

拥有接口可以让您编写使用映射的代码,而无需担心如果以后决定在实现之间进行切换。

NavigableMap< Employee , Project > currentAssignments = new TreeSet<>() ;
currentAssignments.put( alice , writeAdCopyProject ) ; 
currentAssignments.put( bob , setUpNewVendorsProject ) ; 

如果以后更改实现,则此代码仍然有效。也许以后您需要一个支持并发的映射,以便跨线程使用。将该声明更改为:

NavigableMap< Employee , Project > currentAssignments = new ConcurrentSkipListMap<>() ;

…使用该映射的其余代码将继续工作。

选择实施

Map与Java 11捆绑在一起的有十种实现。第三者(例如Google Guava)提供了更多实现。

这是我制作的图形表,突出显示了每种图形的各种功能。请注意,两个捆绑的实现通过检查密钥的内容来使密钥保持排序。同样,EnumMap将其键保持在该枚举上定义的对象的顺序中。最后,LinkedHashMap记住原始的插入顺序。

Java 11中的地图实现表,比较它们的功能

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.