比较Java HashMap中的2个键

时间:2011-03-13 13:13:17

标签: java generics hashmap

我做了BinaryTree< HashMap<String, String> >.

如何比较两个键,以便我可以正确地将两个元素(HashMaps)插入到有序的BinaryTree中? 这是我到目前为止所得到的:

public class MyMap<K extends Comparable<K>, V> extends HashMap<K, V> implements Comparable< MyMap<K, V> >
{

    @override
    public int compareTo(MyMap<K, V> mapTwo)
    {
        if ( (this.keySet().equals(mapTwo.keySet())) ) return 0;
        //How can I check for greater than/less than and keep my generics?  

    }

编辑:每个HashMap中只有一个键(它是一个非常简单的语言翻译系统),因此不需要对键进行排序。我本来希望使用String.compareTo()方法,但由于我的泛型,编译器不知道KString

1 个答案:

答案 0 :(得分:3)

我认为你选择了一个糟糕的数据结构。

HashMaps不是自然订购的。 HashMap集合中的键具有不可预测的顺序,该顺序对填充地图的操作序列很敏感。这使得它不适合比较两个HashMaps。

为了比较一对HashMaps,您需要提取相应的密钥集,对它们进行排序,然后比较排序的集合。换句话说,compareTo派生类的HashSet方法平均为O(NlogN)


FWIW,compareTo实现看起来像这样,假设该方法是根据各自密钥集中的排序列表键来排序HashMaps。显然,还有其他基于密钥集的排序。

public int compareTo(MyMap<K, V> other) {
    List<K> myKeys = new ArrayList<K>(this.keySet());
    List<K> otherKeys = new ArrayList<K>(other.keySet());
    Collections.sort(myKeys);
    Collections.sort(otherKeys);
    final int minSize = Math.min(myKeys.size(), otherKeys.size());
    for (int i = 0; i < minSize; i++) {
        int cmp = myKeys.get(i).compareTo(otherKeys.get(i));
        if (cmp != 0) {
            return cmp;
        }
    }
    return (myKeys.size() - otherKeys.size());
}

如果地图中只有一个键/值对,那么您应该用简单的Pair<K,V>类替换它。使用HashMap代表一对是疯狂的。