¿Cómo puedo solucionar este ArrayIndexOutOfBoundsException en mi tabla hash?

Yeet McGeet:

Me preguntaba si alguien me podría ayudar a este ArrayIndexOutOfBoundsException que se produce al intentar ejecutar una clase probador.

La excepción se produce en el método remove dentro del archivo de tabla hash. He intentado cambiar mi código con el código de mi amigo, pero que no funcionó bien.

Cualquier ayuda sería muy apreciada

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

Aquí está el HashTable:

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 "";
    }
}
}

Aquí está el probador tabla hash:

    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);

        }
    }
}

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

En el enlace de Google unidad compartida por debajo se encuentra un zip que contiene entradas de datos.

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

tobsob:

Su problema es que en este bloque de código:

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

En la última iteración indexserá el mismo que hTable.length. En su ejemplo indexserá del 100 en la que se aceptó la condición. En el siguiente índice de paso se incrementará: index= 101. En hTable[101]la ArrayIndexOutOfBoundsExceptionocurrirá.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=362639&siteId=1
Recomendado
Clasificación