在爪哇中,是否有一个对象像一个用于存储和访问密钥/值对的映射,但是可以返回一个有序的密钥列表和一个有序的值列表,使得密钥和值列表是相同的顺序。
因此,作为代码解释,我正在寻找一些行为类似于我虚构的orderedmap的东西:
OrderedMap om = new OrderedMap<>();
om.put(0,"Zero");
om.put(7,"Seven");
String o = om.get(7); // o is"Seven"
List keys = om.getKeys();
List 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);
}
分类地图
如果您所要做的就是同时遍历这两个映射,那么map.entryset()将允许您在任何映射上都这样做。LinkedHashMap有一个定义良好的顺序,但是对于任何映射,条目集都反映了键/值对。
这段代码不是一个很好的示例,因为任何映射实现都将表现为示例代码。是否排序、排序。
彼得·劳里:你能把这个扩展一下吗?map接口分别以集合和集合的形式返回键和值。这两种方法都不能保证顺序,所以说每个映射实现的行为都像我的示例代码中那样似乎不明智。
在Sun JDK实现中,getKeys和getValues()集返回的集由映射中的entryset()支持,因此具有相同的迭代顺序,这就是您的示例测试。
很有趣,我从没注意到。尽管如此,还是叫我疯狂,但我不喜欢对接口未显式验证的实现进行假设。我以前做过太多次了。
这应该被命名为Java排序映射,因为有序映射是不同的——参见EDCOX1(0)。
实现映射和保持插入顺序的Java类的可能副本?
SortedMap接口(与实现树映射)应该是您的朋友。
接口具有以下方法:
keySet(),按升序返回一组键。
values()返回按相应键的升序排列的所有值的集合。
所以这个接口完全满足您的需求。但是,这些键必须有一个有意义的顺序。否则,可以使用LinkedHashMap,其中顺序由插入顺序决定。
示例:sortedmapmap=new treemap<>();
要使用treemap,它要求key类必须实现可比较的接口。如果不是,则将引发某种RuntimeException。Treemap它也是经过排序的地图,但我认为作者希望使用只是经过排序(未排序)的地图。Linkedhashmap最好只获取有序的映射(如您所说,"由插入顺序决定")。
如果在构建期间(假设您不使用Comparator.naturalOrder())给它一个合适的Comparator,那么TreeMap不需要密钥类来实现Comparable。
这个答案可以通过演示如何遍历keyset()来改进。
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指定。
为了避免读者重复检查,因为很难通过测试来验证,keySet()方法有效地返回一个LinkedHashset,它反映了put()调用的顺序。请注意,对同一个密钥重复调用put()不会更改顺序,除非您提前使用remove()密钥。
LinkedHashMap维护键的顺序。
java.util.linkedhashmap的工作方式与普通的hashmap类似。
这并不能回答这个问题。要评论或要求作者澄清,请在他们的帖子下面留下评论-你可以随时对自己的帖子发表评论,一旦你有足够的声誉,你就可以对任何帖子发表评论。
@我认为这是一个真实的答案,但它与约翰·费米内拉的答案非常相似!
如果你想得到一个有序的映射,当你把条目放入映射时,它们按这个顺序存储,那么LinkedHashMap是正确的答案。如果您想将地图中的条目按照放置顺序进行排序,那么sortedMap是正确的答案。
我认为从框架中得到的最接近的集合是sortedmap
如果我认为这个答案值得输掉分数,我会投反对票。正如上面的答案所指出的,您的答案缺少关于Linkedhashmap的适当信息,对Sortedmap进行一点解释也不错。
@科莱森,在这种情况下,你投的是最好的答案,而不是投的是正确但不是最好的答案。
我就是这么做的。只是说我能理解为什么会有人投反对票。
您可以利用navigablemap接口,该接口可以按升序或降序访问和遍历。此接口旨在取代SortedMap接口。导航地图通常按照其键的自然顺序进行排序,或者通过地图创建时提供的比较器进行排序。
它有三个最有用的实现:treemap、immutablesortedmap和concurrentskiplistmap。
treemap示例:
TreeMap users = new TreeMap();
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) +")");
}
输出:
Alice (ID = 2)
Bob (ID = 1)
John (ID = 3)
由于Java 6还存在对TeMeAP的非阻塞线程安全替代。参见Concurrentskiplistmap。
我认为sortedmap接口强制执行您请求的内容,treemap实现了这一点。
我使用简单的哈希图、链接列表和集合按值对映射进行排序。
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 map = new HashMap();
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> list = new LinkedList>(map.entrySet());
// sort the linked list using Collections.sort()
Collections.sort(list, new Comparator>(){
@Override
public int compare(Entry m1, Entry m2) {
return m1.getValue().compareTo(m2.getValue());
}
});
for(Entry value: list) {
System.out.println(value);
}
}
}
输出是:
C=0
C++=1
Java=2
Python=3
JavaScript=4
Golang=5