【问题标题】:Java Hash Table Search FunctionJava 哈希表搜索功能
【发布时间】:2013-04-27 03:22:05
【问题描述】:

我创建了一个哈希表,但我似乎遇到了一个问题。我在哈希表中有数据,当搜索它按预期返回的数据时。但是,如果我搜索不在表中但仍然散列到存在的元素的东西,它不会返回 false。

例如:我将 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);
}
}

【问题讨论】:

  • 我希望您将其作为练习而不是在实际应用程序中使用。如果是后者,您应该强烈考虑改用库 HashMap 类。
  • 我只是想了解 Java 为我们提供了什么的背景......

标签: java hashtable


【解决方案1】:

这是一个经典的 == vs .equals() 问题。

a[i].record.getKey() != k 可以为真,a[i].record.getKey().equals(k) 也为真。

您应该使用(!a[i].record.getKey().equals(k)) 而不是a[i].record.getKey() != k

【讨论】:

  • 非常感谢!我以为我今天在某个时候尝试过,但显然没有。我必须等待几分钟才能将其标记为答案...
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 2012-10-12
  • 1970-01-01
  • 2013-10-22
  • 2010-09-08
相关资源
最近更新 更多