Java 哈希表中的Remove方法
嗨,我正在做一个关于哈希表的作业。除了删除方法外,一切都很好。 以下是代码:Java 哈希表中的Remove方法,java,hashtable,Java,Hashtable,嗨,我正在做一个关于哈希表的作业。除了删除方法外,一切都很好。 以下是代码: public boolean remove(K key) throws HashTableException { // //IMPLEMENT THIS FUNCTION // if (key == null) throw new HashTableException("Null keys not allowed in the hash table"); int
public boolean remove(K key) throws HashTableException {
//
//IMPLEMENT THIS FUNCTION
//
if (key == null)
throw new HashTableException("Null keys not allowed in the hash table");
int index = getIndex(key);
HashTableNode<K,V> node = FindNode(key,index);
if (node == null) {
return false;
} else {
if (node.getNext() == null) {
node = null;
} else {
node = node.getNext();
}
return true;
}
}
public boolean remove(K键)抛出HashTableException{
//
//实现这个功能
//
if(key==null)
抛出新的HashTableException(“哈希表中不允许使用空键”);
int index=getIndex(键);
HashTableNode=FindNode(键,索引);
if(node==null){
返回false;
}否则{
if(node.getNext()==null){
node=null;
}否则{
node=node.getNext();
}
返回true;
}
}
它根本不会取下钥匙。有人能帮我吗?谢谢大家! 请确保hashcode()和equals()被正确重写。节点=null;不“删除”节点,它只是将此方法中变量节点的值设置为null。它对哈希表中某个位置的实际节点不做任何操作
在下一个“else”中,您将得到node=node.getNext();同样,在该方法中只更改节点变量。但是,由于您从方法返回时没有对该变量做任何其他操作,因此,由于node是一个仅存在于该方法中的局部变量,所以所做的一切都是无效的
您应该仔细阅读java中的局部变量和引用的概念,这可能会让您理解为什么这不起作用:)node=node.getNext()
通过这一行,我认为您只是在遍历,而不是重新编写下一个指针
也许你应该试试node.getPrev().setNext=node.getNext();
如果可以找到上一个节点并能够设置下一个节点。请确保覆盖用作键的对象的equals和hashcode方法。实际的删除操作在哪里进行?您只需将指针设置为
null
或重新分配它,这不会影响从中获取指针的哈希桶。如果有返回
,则不需要将代码包装在else
中。请格式化您的代码。请坚持Java命名约定-方法应该是小写的。我想你有一个带bucket的哈希表。因此,在这种情况下,您应该通过键在bucket中找到根(而不是要删除的元素)元素,然后遍历此链接列表并删除项。这只会更改局部变量,对实际表不做任何操作。这将从链接结构Nope中删除节点。它只会将局部变量节点中的引用更改为链接结构中的下一个节点。它不会改变实际结构。您的意思是node=node.getNext()?对如果你错过了,我在回答中就是这么说的。通过setNext()这意味着,如果您没有获得itHmm,它将更改下一部分的链接,我不确定我昨天读的是否正确。今天我看到你写了getPrev().setNext,对此我很抱歉。哦,真奇怪。你刚才没有编辑这些吗PHi Plux,你说的很有道理。我不是计算机科学专业的学生,只是想学习一些编码技巧。在这个类中,我们有一个表[],它是HashTalbe的数组。我仍然不知道如何实现真正的removeGlad,这很有意义。如果在这个类中提供更多的代码,那么直接建议删除节点的更改可能会更容易。知道数据存储在一个数组中,我可以想出几种不同的实现方法,它们要求您以不同的方式实现remove函数。