比较Java HashMap中的两个键
我制作了一个比较Java HashMap中的两个键,java,generics,hashmap,Java,Generics,Hashmap,我制作了一个二进制树 如何比较这两个键,以便将这两个元素(HashMaps)正确插入到有序二进制树中? 以下是到目前为止我得到的信息: public class MyMap<K extends Comparable<K>, V> extends HashMap<K, V> implements Comparable< MyMap<K, V> > { @override public int compareTo(MyMa
二进制树
如何比较这两个键,以便将这两个元素(HashMaps)正确插入到有序二进制树中?
以下是到目前为止我得到的信息:
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?
}
公共类MyMap扩展HashMap实现可比较的
{
@凌驾
公共整数比较(MyMap Map二)
{
if((this.keySet().equals(maptow2.keySet()))返回0;
//如何检查大于/小于并保留我的泛型?
}
编辑:每个HashMap中只有一个键(这是一个非常简单的语言翻译系统),因此不需要对键进行排序。我希望使用
字符串。compareTo()
方法,但由于我的泛型,编译器不知道K
是字符串
我认为您选择了错误的数据结构
HashMap不是自然排序的。HashMap集合中的键具有不可预测的顺序,该顺序对填充该映射的操作序列敏感。这使得比较两个HashMap不合适
为了比较一对哈希映射,您需要提取相应的键集,对它们进行排序,然后比较排序后的集。换句话说,HashSet
派生类的compareTo
方法平均为O(NlogN)
FWIW,一个
compareTo
实现看起来是这样的,假设该方法是基于排序后的列表键在其各自的键集中对哈希映射进行排序。显然,还有其他基于键集的排序
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());
}
public int compareTo(MyMap-other){
List myKeys=newarraylist(this.keySet());
List otherKeys=newarraylist(other.keySet());
Collections.sort(myKeys);
Collections.sort(其他键);
final int minSize=Math.min(myKeys.size(),otherKeys.size());
对于(int i=0;i
如果映射中只有一个键/值对,则应将其替换为简单的
对类。使用HashMap
表示单个对是…疯狂的。既然使用字符串作为键,您可以迭代每个键,并将字符串与其他键进行比较。为什么不使用另一个类并将该类存储在BinaryTree中。然后,您可以使用类的“compareTo”方法委托给“String.compareTo()”,感谢您的快速回复。我应该声明HashMap中只有一个字符串映射到另一个字符串,所以键的顺序应该不会有问题。我尝试使用String.compareTo()方法,但由于在编译时它是paraameterized类型“K”,编译器不知道密钥是字符串。您的解决方案似乎正在工作,谢谢。您的对建议是个好主意,我不知道为什么我没有想到这一点……Calum您能在这里发布完整的工作示例以及main方法吗。@Deepak这是probably在这里发布的内容有点太多了,但我可以通过其他方式向您发送相关部分?@Deepak-我回答的要点是您不应该使用这种数据结构。我不会通过向您展示如何操作来鼓励糟糕的软件工程。