为了账号安全,请及时绑定邮箱和手机立即绑定

哈希表算术异常

哈希表算术异常

芜湖不芜 2021-12-30 17:41:32
我目前正在编写一个哈希表,但是当我测试它时。它给了我错误java.lang.ArithmeticException / by zero。这是我的代码:   private int hash(String key)    {        int hashIdx = 0;        int size = m_hashTable.length;        for (int i = 0; i < m_hashTable.length; i++)        {            hashIdx += key.charAt(i);        }        return hashIdx % maxSize;    }返回导致了问题。import java.util.*; public class DSAHashTable{    private DSAHashEntry[] m_hashTable;    private int maxSize, size;    //contructor    public DSAHashTable()    {        this.maxSize = maxSize;         m_hashTable = new DSAHashEntry[maxSize];        for (int i = 0; i < m_hashTable.length; i++)        {            m_hashTable[i] = null;        }    }     //Adds new element    public void put(String key, Object value)    {        int tmp = hash(key);        int i = tmp;        do        {            if (m_hashTable[i] == null)            {                m_hashTable[i].setKey(key);                m_hashTable[i].setValue(value);                size++;                return;            }            else if (m_hashTable[i].equals(key))            {                       m_hashTable[i].setValue(value);                return;            }            i = (i + 1) % maxSize;        }while (i != tmp);        }    public Object get(String key)    {        int i = hash(key);        while (m_hashTable[i] != null)        {            if (m_hashTable[i].equals(key))            {                return m_hashTable[i].getValue();            }            i = (i + 1) % maxSize;        }        return null;    }    public void remove(String key)    {        int i = hash(key);        while (!key.equals(m_hashTable[i].getKey()))        {            i = (i + 1) % maxSize;         } 
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

你x % maxSize在很多地方计算,当maxSize是 时0,这会导致ArithmeticException。


初始化maxSize为正值。


请注意以下几点:


public DSAHashTable()

{

    this.maxSize = maxSize;

    ...

}

相当于


public DSAHashTable()

{

    this.maxSize = this.maxSize;

    ...

}

这是没有意义的。


要么接受 的初始值maxSize作为构造函数参数:


public DSAHashTable(int maxSize)

{

    if (maxSize <= 0)

        throw new IllegalArgumentException("Illegal max size: " + maxSize);

    this.maxSize = maxSize;

    ...

}

或将其初始化为某个默认的正值:


static final int DEFAULT_MAX_SIZE = 10;


public DSAHashTable()

{

    this.maxSize = DEFAULT_MAX_SIZE;

    ...

}


查看完整回答
反对 回复 2021-12-30
?
当年话下

TA贡献1890条经验 获得超9个赞

似乎错误出在构造函数中。您正在使用 ... 本身初始化字段 maxSize。

您应该为构造函数提供一个 int 参数,以便您可以将一个非零值传递给 maxSize 字段。


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 176 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号