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
LinkedHashMap维护键的顺序。
java.util.linkedhashmap的工作方式与普通的hashmap类似。
我认为从框架中得到的最接近的集合是sortedmap
您可以利用navigablemap接口,该接口可以按升序或降序访问和遍历。此接口旨在取代SortedMap接口。导航地图通常按照其键的自然顺序进行排序,或者通过地图创建时提供的比较器进行排序。
它有三个最有用的实现:treemap、immutablesortedmap和concurrentskiplistmap。
treemap示例:
1 2 3 4 5 6 7 8 |
输出:
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 |