Java Map Value Comparator,插入时排序

时间:2012-10-28 12:44:16

标签: java sorting dictionary insert

我想使用值Comparator将项插入HashMap,TreeMap或SortedMap(您可能会建议其他api)。

我已经阅读了很多帖子,包括这个one,大多数帖子建议在插入所有项目后将HashMap重新插入带有值Comparator的SortedMap。

我不想再次重新插入所有值。是否有选项或Map类似的数据结构支持在每次插入后激活值Comparator?

如果有重复的问题,我会很感激链接(我做了一些搜索,虽然我可能错过了一些)

同样,我有兴趣为某种有序的Map添加一个值,以便在每次插入后,所有项目都按值而不是键排序。

Map条目中的值实际上是一个带有一些getter的复杂Object,我想只对值对象上的特定getter进行排序。

4 个答案:

答案 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();
    }

}