我做了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()
方法,但由于我的泛型,编译器不知道K
是String
答案 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
代表一对是疯狂的。