我想使用值Comparator将项插入HashMap,TreeMap或SortedMap(您可能会建议其他api)。
我已经阅读了很多帖子,包括这个one,大多数帖子建议在插入所有项目后将HashMap重新插入带有值Comparator的SortedMap。
我不想再次重新插入所有值。是否有选项或Map类似的数据结构支持在每次插入后激活值Comparator?
如果有重复的问题,我会很感激链接(我做了一些搜索,虽然我可能错过了一些)
同样,我有兴趣为某种有序的Map添加一个值,以便在每次插入后,所有项目都按值而不是键排序。
Map条目中的值实际上是一个带有一些getter的复杂Object,我想只对值对象上的特定getter进行排序。
答案 0 :(得分:3)
我认为您需要的是org.apache.commons.collections.bidimap.TreeBidiMap
基于红黑树的BidiMap实现,其中添加的所有对象都实现了Comparable接口。
此类保证地图将按升序键顺序和升序值顺序排列,并根据键和值类的自然顺序进行排序。
答案 1 :(得分:3)
虽然我有一些解决方法,它并不完美,而且会使用更多的内存,但它相当简单。
我可以扩展Map的键以保存Value对象的getter返回的值,然后我将扩展键Comparator以按键的右元组排序。
<强>更新强>
作为一个表现非常出色的魅力。
答案 2 :(得分:2)
地图都是关于从钥匙到价值的。 Guava有一个bidirectional mappings的概念,但你并不真正关心从值到关键,而是暴露一个排序的值迭代。我推荐的是一个包含HashMap和Priority Queue的自定义容器。
因此,扩展Map,Collection和Iterable接口,并将插入添加到HashMap和Priority Queue中。迭代时,在搜索/转到地图时迭代队列。
答案 3 :(得分:1)
我正在寻找类似的东西,并且无法使用TreeBidiMap
,因为它需要Map的密钥才能实现Comparable接口。
所以我写了自己的简约ValueTreeMap
:
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;
public class ValueTreeMap<K, V extends Comparable<V>> implements Iterable<V> {
private TreeSet<V> tree = new TreeSet<V>();
private HashMap<K, V> map = new HashMap<K, V>();
public void put(K key, V value){
V oldValue = map.get(key);
if(oldValue != null){
tree.remove(oldValue);
}
tree.add(value);
map.put(key, value);
}
public V get(K key){
return map.get(key);
}
@Override
public Iterator<V> iterator() {
return tree.iterator();
}
}