当发生碰撞时,我当前的二次探测实现会用新项目覆盖当前索引中存储的项目。我插入三个 Person 对象,这些对象是通过使用他们的姓氏作为键来存储的。为了测试实现的冲突解决方案,它们都具有相同的姓氏,即“Windmill”。
我需要实现来保留所有人员对象,但只需将它们移动到不同的索引而不是覆盖它们。
列表大小已设置为 7,存储在变量“M”中,用于插入函数中的模数。
插入功能
@Override
public void put(String key, Person value) {
int tmp = hash(key);
int i, h = 0;
for (i = tmp; keys[i] != null; i = (i + h * h++) % M) {
collisionCount++;
if (keys[i].equals(key)) {
values[i] = value;
return;
}
}
keys[i] = key;
values[i] = value;
N++;
}
哈希函数
private int hash(String key) {
return (key.hashCode() & 0x7fffffff) % M;
}
获取函数
@Override
public List<Person> get(String key) {
List<Person> results = new ArrayList<>();
int tmp = hash(key);
int i = hash(key), h = 0;
while (keys[i] != null)
{
if (keys[i].equals(key))
results.add(values[i]);
i = (i + h * h++) % M;
}
return results;
}
当我删除覆盖先前值的代码时,索引 int 溢出并变成负数,导致程序崩溃。