2013-05-02 3 views
2

У меня есть таблица хэша, созданная, но я, похоже, застрял в одной проблеме. У меня есть данные в хеш-таблице и при поиске данных он возвращается, как и ожидалось. Однако, если я ищу что-то, чего нет в таблице, но все же хеширует к элементу, который присутствует, он не возвращает false.Функция поиска таблицы Hash таблицы

Например: У меня есть Hello в качестве ключа в моей хэш-таблице, скажем, элемент 15. Затем я выполняю поиск по World и он хэширует то же, что и Hello, например.

Что я ожидаю, что мой код должен возвращать null, потому что, хотя хэширование ключа тоже одно и то же, они не равны. Но мой код ниже, вернет ключ/данные (запись) для Hello вместо этого.

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

Запись класса

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); 
} 
} 
+0

Я надеюсь, что вы делаете это упражнение, а не использовать в реальных приложениях. Если последнее, вы должны использовать библиотеку HashMap вместо этого. –

+0

Я просто пытаюсь понять фон того, что Java предоставляет нам ... – Chris

ответ

4

Это классический == против .equals() проблема.

a[i].record.getKey() != k может быть правдой, а a[i].record.getKey().equals(k) также верен.

вы должны использовать (!a[i].record.getKey().equals(k)) вместо a[i].record.getKey() != k

+0

Большое вам спасибо! Я думал, что однажды попытался это сделать, но, очевидно, этого не произошло. Я должен подождать несколько минут, прежде чем я смогу отметить это как ответ ... – Chris

Смежные вопросы