4

我想使用值比较器将项目插入 HashMap、TreeMap 或 SortedMap(您可能会建议其他一些 api)。

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

我没有兴趣再次重新插入所有值。是不是有一个选项或类似 Map 的数据结构支持在每次插入后激活值比较器?

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

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

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

4

4 回答 4

3

我想你需要的是org.apache.commons.collections.bidimap.TreeBidiMap

BidiMap 基于红黑树的实现,其中添加的所有对象都实现了 Comparable 接口。

此类保证映射将按键升序和值升序排列,根据键和值类的自然顺序进行排序。

于 2012-10-28T13:05:34.720 回答
3

我有一些解决方法,它并不完美,并且会使用更多的内存,但它相当简单。

我可以扩展 Map 的键来保存 Value 对象的 getter 返回的值,然后我将扩展键 Comparator 以按键的右元组排序。

更新

作为一个具有非常好的性能的魅力。

于 2012-10-28T13:14:24.497 回答
2

地图都是关于从键到值的。Guava 有一个双向映射的概念,但您并不真正关心从值到键,而是公开值的排序迭代。我推荐的是一个自定义容器,它可以容纳 HashMap 和Priority Queue

因此,扩展 Map、Collection 和 Iterable 接口,并将插入添加到 HashMap 和优先级队列中。当您迭代时,迭代队列,当您搜索/进入地图时。

于 2012-10-28T12:54:06.720 回答
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();
    }

}
于 2016-12-06T01:44:50.537 回答