关于集合:Java有序映射

Java Ordered Map

在爪哇中,是否有一个对象像一个用于存储和访问密钥/值对的映射,但是可以返回一个有序的密钥列表和一个有序的值列表,使得密钥和值列表是相同的顺序。

因此,作为代码解释,我正在寻找一些行为类似于我虚构的orderedmap的东西:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OrderedMap<Integer, String> om = new OrderedMap<>();
om.put(0,"Zero");
om.put(7,"Seven");

String o = om.get(7); // o is"Seven"
List<Integer> keys = om.getKeys();
List<String> values = om.getValues();

for(int i = 0; i < keys.size(); i++)
{
    Integer key = keys.get(i);
    String value = values.get(i);
    Assert(om.get(key) == value);
}


SortedMap接口(与实现树映射)应该是您的朋友。

接口具有以下方法:

  • keySet(),按升序返回一组键。
  • values()返回按相应键的升序排列的所有值的集合。

所以这个接口完全满足您的需求。但是,这些键必须有一个有意义的顺序。否则,可以使用LinkedHashMap,其中顺序由插入顺序决定。


Is there an object that acts like a Map for storing and accessing key/value pairs, but can return an ordered list of keys and an ordered list of values, such that the key and value lists are in the same order?

您正在查找java.util.linkedhashmap。您将得到map.entry对的列表,这些对总是以相同的顺序迭代。该顺序与您放入项目的顺序相同。或者,使用java.util.sortedmap,其中键必须具有自然顺序或由Comparator指定。


LinkedHashMap维护键的顺序。

java.util.linkedhashmap的工作方式与普通的hashmap类似。


我认为从框架中得到的最接近的集合是sortedmap


您可以利用navigablemap接口,该接口可以按升序或降序访问和遍历。此接口旨在取代SortedMap接口。导航地图通常按照其键的自然顺序进行排序,或者通过地图创建时提供的比较器进行排序。

它有三个最有用的实现:treemap、immutablesortedmap和concurrentskiplistmap。

treemap示例:

1
2
3
4
5
6
7
8
TreeMap<String, Integer> users = new TreeMap<String, Integer>();
users.put("Bob", 1);
users.put("Alice", 2);
users.put("John", 3);

for (String key: users.keySet()) {
  System.out.println(key +" (ID ="+ users.get(key) +")");
}

输出:

1
2
3
Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)

由于Java 6还存在对TeMeAP的非阻塞线程安全替代。参见Concurrentskiplistmap。


我认为sortedmap接口强制执行您请求的内容,treemap实现了这一点。

http://java.sun.com/j2se/1.5.0/docs/api/java/util/sortedmap.htmlhttp://java.sun.com/j2se/1.5.0/docs/api/java/util/treemap.html


我使用简单的哈希图、链接列表和集合按值对映射进行排序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.util.*;
import java.util.Map.*;
public class Solution {

    public static void main(String[] args) {
        // create a simple hash map and insert some key-value pairs into it
        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("Python", 3);
        map.put("C", 0);
        map.put("JavaScript", 4);
        map.put("C++", 1);
        map.put("Golang", 5);
        map.put("Java", 2);
        // Create a linked list from the above map entries
        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
        // sort the linked list using Collections.sort()
        Collections.sort(list, new Comparator<Entry<String, Integer>>(){
        @Override
         public int compare(Entry<String, Integer> m1, Entry<String, Integer> m2) {
        return m1.getValue().compareTo(m2.getValue());
        }
      });
      for(Entry<String, Integer> value: list) {
         System.out.println(value);
     }
   }
}

输出是:

1
2
3
4
5
6
C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5