Fonction de Recherche de Table de Hachage Java


J'ai créé une table de hachage mais je semble être coincé sur un problème. J'ai des données dans la table de hachage et lors de la recherche des données, elles retournent comme prévu. Cependant, si je recherche quelque chose qui n'est pas dans la table mais qui est toujours haché vers un élément présent, il ne renvoie pas false.

Par exemple: J'ai Hello comme clé dans ma table de hachage, disons l'élément 15. Je fais ensuite une recherche de Monde et il hache la même chose que Bonjour, juste par exemple.

Ce que j'attends de mon le code à faire est de retourner null car même si la clé est hachée de la même manière, ils ne sont pas égaux. Mais mon code ci-dessous retournera la clé/les données (enregistrement) pour Hello à la place.

 @SuppressWarnings("rawtypes")
public Record search(T k) {
    int i = hash(k);//Assign the computed hash value (combination of Record Class hashCode and Table's hash function above) to i.
    if (a[i] == null || a[i].record.equals(k)) { 
        return null; 
    } else if (!a[i].record.equals(i) && a[i].record.getKey() != k) {//otherwise, the record is found and if the key stored does not equal the key being searched return null
        return a[i].record;
    } else { //otherwise the record is not the first record in the linked list
        cursor = a[i]; //set cursor to equal the entire list of records sorted a the hash key reference
        if (cursor.record.getKey() != k) { //if the key at cursor.record does not equal key (k), then move onto the cursor.next
            return cursor.next.record;
        }
    }
    return null;
}

Classe d'Enregistrement

public class Record<T, U> {

private T key;//Contacts name, and the value that is ultimately hashed. It is then inserted, searched and deleted
private U data;//This data is the Contacts address, when the key is hashed, nothing is done to this value except that it is 
//either stored or retrieved from the hash table when the key is used

public T getKey() {
    return key;//returns the value stored as a key
}

public void setKey(T k) {
    this.key = k;//used during the insert operation to set key's value.
}

public U getData(T k) {//retrieve the data that is stored with an associated key that has been updated, searhed or is being written to a file
    return data;
}

public void setData(U data) {//adds the data to the records data element
    this.data = data;
}

public int hashCode(T k) {//When this hash code function is called, it returns a mathematical representation of the key, that was passed to it
    //it returns the absolute value of the generic hashCode() function. Further computations are required in the Table class, since the hash created here
    //can be very large and would throw and exception.  For example, the hash for "Chris" after this computation has been performed is 94639767, which is
    //much larger than our array. So this will cause an IndexOutOfBoundsException().
    return Math.abs(k.hashCode());
}

public boolean equals(Record<T, U> r) {
    //this equals method, doesn't override the generic equals() method provided by Java. Instead, this method is created to use instead of the generic
    //equals method. When this is called, the has value computed above, with the additional math from the Table class, is compared to all of the elements
    //in the array. If a match is found, this returns true
    return key.equals(r.key);
}
}
Author: Benjamin, 2013-05-03

1 answers

C'est un classique == vs .equals() problème.

a[i].record.getKey() != k peut être vrai tout a[i].record.getKey().equals(k) est aussi vrai.

, Vous devez utiliser (!a[i].record.getKey().equals(k)) au lieu de a[i].record.getKey() != k

 4
Author: Clint, 2013-05-02 20:10:11