gpt4 book ai didi

java - 如何修复哈希表中的 ArrayIndexOutOfBoundsException?

转载 作者:行者123 更新时间:2023-11-30 05:21:58 26 4
gpt4 key购买 nike

我想知道是否有人可以帮助我尝试运行测试器类时发生的 ArrayIndexOutOfBoundsException。

哈希表文件中的删除方法发生异常。我尝试过将我的代码与我 friend 的代码交换,但这也不起作用。

任何帮助将不胜感激

================================================== =============================

这是哈希表:

public class HashTable {

Object[] hTable;
int mSize;
int size;

HashTable() {
mSize = 101;
hTable = new Object[mSize];
}

HashTable(int initCap) {
mSize = initCap;
}

Object put(Object key, Object value) {
if (size == mSize) {
throw new IllegalStateException("No room within the hashtable");
}

int hashC = key.hashCode();
int index = hashC % mSize;

size++;

while (index < hTable.length) {
if (hTable[index] == null) {
hTable[index] = new Entry(key, value);
size++;
return null;

} else if (((Entry) hTable[index]).key.equals(key)) {
Object prevVal = ((Entry) hTable[index]).val;
hTable[index] = new Entry(key, value);
return prevVal;

} else if (((Entry) hTable[index]).rCheck) {
hTable[index] = new Entry(key, value);

while (index < hTable.length) {
index++;
if (hTable[index] == null) {
size++;
return null;
} else if (((Entry) hTable[index]).key.equals(key)) {

Object prevVal = ((Entry) hTable[index]).val;
((Entry) hTable[index]).remove();

return prevVal;
}
}
}
index++;
}

if (hTable[index] == null) {
hTable[index] = new Entry(key, value);
return null;

} else {

Object oldEntry = ((Entry) hTable[index]).val;
hTable[index] = new Entry(key, value);
return oldEntry;
}

}

Object get(Object key) {
int hashC = key.hashCode();
int index = hashC % mSize;

return ((Entry) hTable[index]).val;
}

Object remove(Object key) {
int hashC = key.hashCode();
int index = hashC % mSize;

Object returnObj = null;

while (hTable[index] != null) { //here is where the OutOfBounds error occurs
if (((Entry) hTable[index]).key.equals(key)) {
returnObj = ((Entry) hTable[index]).val;
((Entry) hTable[index]).remove();

size--;
break;
}
index++;
}
return returnObj;
}

int size() {
return size;
}

@Override
public String toString() {
String returnString = "";

for (int i = 0; i < hTable.length; i++) {
if (hTable[i] == null || ((Entry) hTable[i]).rCheck) {
returnString += "dummy\n";
continue;
}

returnString += "Index: " + i +
" \n Key: " + ((Integer) (((Entry) hTable[i]).key)).intValue() % 101 +
"\nValue: " + (String) (((Entry) hTable[i]).val) +
"\n++++++++++++++++++++++++++++++++++++++++++++++\n";
}

return returnString;
}

private class Entry {
Object key;
public boolean rCheck;
public Object val;

Entry() {
key = null;
val = null;
rCheck = false;
}

Entry(Object k, Object v) {
key = k;
val = v;
rCheck = false;
}

Object value() {
return val;
}

Object key() {
return key;
}

void remove() {
rCheck = true;
}

public String toString() {
return "";
}
}
}

这是哈希表测试器:

    import java.io.*;
import java.util.*;

public class hashTest {
public static void main(String args[]) throws FileNotFoundException {
HashTable hashTable = new HashTable();
Scanner fileRead = new Scanner(new File("data1.txt"));
while(fileRead.hasNext()) {
Object key = fileRead.next();
fileRead.next();
Object value = fileRead.nextLine();
hashTable.put(key, value);
System.out.println(hashTable.get(key));
}
Scanner fileRead2 = new Scanner(new File("data2.txt"));
while(fileRead2.hasNext()){
Object key = fileRead2.next();
hashTable.remove(key);
fileRead2.nextLine();

}
Scanner fileRead3 = new Scanner(new File("data3.txt"));
while(fileRead3.hasNext()){
Object key = fileRead3.next();
fileRead3.next();
Object value = fileRead3.nextLine();
hashTable.put(key, value);

}
Scanner fileRead4 = new Scanner(new File("data4.txt"));
while(fileRead4.hasNext()){
Object key = fileRead4.next();
fileRead4.next();
Object value = fileRead4.nextLine();
hashTable.put(key, value);

}
}
}

================================================== =============================

在下面的共享 Google 云端硬盘链接中,您将找到一个包含数据输入的 zip。

https://drive.google.com/file/d/1iYrzWl9mtv_io3q7K1_m2EtPFUXGbC3p/view?usp=sharing

最佳答案

您的问题出在这个代码块:

 while (index < hTable.length) {
index++;
if (hTable[index] == null)...

在最后一次迭代中,index 将与 hTable.length 相同。在您的示例中,条件将被接受,index 将为 100。在下一步中,索引将增加:index = 101。在hTable[101]处,将发生ArrayIndexOutOfBoundsException

关于java - 如何修复哈希表中的 ArrayIndexOutOfBoundsException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59420592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com