如何在Java中使用SortedMap接口?

时间:2011-09-15 08:14:19

标签: java sortedmap

我有一个

 Map<Float, MyObject>

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

SortedMap是最佳答案吗? TreeMap?我该如何使用它?

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

5 个答案:

答案 0 :(得分:81)

我会使用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());
}

请参阅Java tutorial page for SortedMap here a list of tutorials与TreeMap有关。

答案 1 :(得分:41)

TreeMap可能是最简单的方法。你使用它就像普通的Map一样。

    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,看看你能用它做些什么。

答案 2 :(得分:3)

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

  

我该如何使用它?

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

答案 3 :(得分:2)

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

您可以调用keySet按升序检索所有密钥。

答案 4 :(得分:0)

tl; dr

使用与Java 6捆绑在一起的Map实现中的一种,以及以后的实现NavigableMapSortedMap的后继)的实现:

  • 如果运行单线程,或者如果映射在首次填充后在线程间是只读的,则使用TreeMap
  • 如果要跨线程处理映射,请使用ConcurrentSkipListMap

NavigableMap

仅供参考,SortedMap界面由NavigableMap界面取代。

如果使用尚未声明支持SortedMap的第三方实现,则只需要使用NavigableMap。在与Java捆绑在一起的地图中,实现SortedMap的两个实现也都实现了NavigableMap

接口与具体类

的SortedMap最佳答案?树图?

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

具有接口允许您编写使用映射的代码,如果以后决定在实现之间进行切换,则不会中断。

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

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

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

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

选择实施

与Java 11捆绑在一起的Map有十种实现。还有更多的第三方提供的实现,例如Google Guava

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

Table of map implementations in Java 11, comparing their features