我目前正在为我的哈希表使用这个方法,它目前看起来是这样的。
public void remove(String key) throws MapException {
// TODO Auto-generated method stub
for(int i = 0; i <List.length;i++){
if(List[i] !=null && List[i].equals(key)){
List[i] = null;
numberOfElements--;
}else{
throw new MapException("Nothing here", null);
}
}
}
我的问题是,当我删除抛出新的MapException时,它可以从哈希表中删除实际条目,但当它存在时,它会抛出异常,但不删除实际条目?
我怀疑List[I]已经为空并且'if'块从未执行过。在这种情况下:
-
保持MapException异常将被抛出
-
删除MapException将在该迭代中不执行任何操作,List[i]将保留空值,这导致您认为'if'块已被执行。
循环抛出第一个找到的条目,该条目为空或其键不等于给定的键。因此,如果您想要删除的键位于列表中的该键之后,则永远不会到达该键。
您应该更改if语句中的逻辑,以检查它是否不是搜索键,以便继续执行下一个列表条目。如果你找到了一个键并删除了它,那么你必须记住它,以便抛出AFTER循环:
public void remove( String key ) throws Exception
{
boolean deleted = false;
for ( int i = 0; i < list.length; i++ )
{
if ( List[i] == null || !List[i].equals( key ) )
{
continue;
}
ist[i] = null;
numberOfElements--;
deleted = true;
}
if ( !deleted )
{
throw new Exception( "Nothing here" );
}
}
BTW1:异常构造函数中的第二个参数用于提供嵌入异常(例如,在catch块中,您希望将捕获的异常嵌入到新异常中)。提供null是没有意义的。
BTW2:在编写代码时一定程度的谨慎可以防止许多令人头痛的情况("为什么这不起作用……")。在您粘贴的代码中,有几个东西"闻起来":
- 删除未使用的代码("//TODO自动生成方法存根")
- 遵循完美的格式(缩进)
- 遵循常用的命名方式:变量和方法以小写字母开头,类以大写字母开头。名称"List"在java中已经作为类(接口)的名称存在。AND:"list"并没有说太多。此处最好将其命名为"keys"。
BTW3:你好像只把要删除的键设置为空。关联值是什么(你说的是"map")?