我正在寻找一个基本上像HashMap
那样工作的容器,我可以在O(1)时间放置并获取任何条目。我也希望能够迭代,但我想按顺序对订单进行排序。因此TreeMap
和LinkedHashMap
都不适合我。我找到了以下示例:
SortedSet<Map.Entry<String, Double>> sortedSet = new TreeSet<Map.Entry<String, Double>>(
new Comparator<Map.Entry<String, Double>>() {
@Override
public int compare(Map.Entry<String, Double> e1,
Map.Entry<String, Double> e2) {
return e1.getValue().compareTo(e2.getValue());
}});
问题是SortedSet
没有获取条目的get方法。
我将在我将添加条目的地方使用此集合,但是在已经存在条目的情况下,将更新值(double),然后使用比较器(比较上面提到的值)再次对其进行排序。我能用什么来满足我的需求?
答案 0 :(得分:1)
Java类库中没有这样的数据结构。
但是你可以创建一个私有HashMap的包装器和一个具有相同键/值对的私有TreeMap。
这提供了get
复杂度为O(1)
的数据结构,如常规HashMap
(但不是put
或其他更新操作),以及密钥集和条目设置可以按关键顺序迭代...按照本课题原始版本的要求。
这是一个开始:
public class HybridMap<K,V> implements Map<K,V> {
private HashMap<K,V> hashmap = ...
private TreeMap<K,V> treemap = ...
@Override V get(K key) {
return hashmap.get(key);
}
@Override void (K key, V value) {
hashmap.put(key, value);
treemap.put(key, value);
}
// etcetera
}
显然,我只实现了一些(简单)方法。
如果您希望能够按值顺序(而不是键顺序)迭代条目,那么Java类库中就没有这样的数据结构。
在这种情况下,如果您需要生成的HashMap
完全符合API合同,那么换行TreeMap
和Map
会非常复杂。
所以我建议您只使用键/值对的HashMap和TreeSet ...并手动将它们保持在步骤中。