[英]I'm having an ArrayIndexOutOfBoundsException and I don't know why
[英]I don't know why ArrayIndexOutOfBoundsException occur in Separate Chaining
我在實施“單獨鏈接哈希”時遇到問題。 我按如下方式制作了哈希函數,並期望使哈希值小於M。
private int hash(K key) {
return (key.hashCode() & 0x7fffffff) & M;
}
我不知道為什么我得到ArrayIndexOutOfException。 當我嘗試調試時,我輸入了“ def”鍵,其哈希值為5。但是,我將M大小配置為5,並嘗試對其進行模塊化。 我絕對不明白為什么def的哈希值是5。我該如何解決?
class SeparateChainingHashST<K, V> {
private int N;
private int M;
private SequentialSearchST<K, V>[] st;
public SeparateChainingHashST() {
this(5);
}
public SeparateChainingHashST(int M) {
this.M = M;
st = (SequentialSearchST<K, V>[]) new SequentialSearchST[M];
for (int i = 0; i < M; i++)
st[i] = new SequentialSearchST<>();
}
public void insert(K key, V val) {
int idx = hash(key);
st[idx].insert(key, val);
}
public void delete(K key) {
st[hash(key)].delete(key);
}
public void keys() {
for (int i = 0; i < M; i++) {
for (K key : st[i].keys())
System.out.print(key + " ");
System.out.println("");
}
}
private int hash(K key) {
return (key.hashCode() & 0x7fffffff) & M;
}
}
public class Main {
public static void main(String[] args) {
SeparateChainingHashST<String, Integer> dictionary = new SeparateChainingHashST<>();
Scanner scan = new Scanner(System.in);
while (true) {
System.out.print("Input key and value: ");
String key = scan.next();
Integer val = scan.nextInt();
if (key.equals("quit"))
break;
dictionary.insert(key, val);
}
dictionary.keys();
}
}
class Node<K,V> {
K key;
V val;
Node<K,V> next;
public Node(K key, V val, Node<K,V> next) {
this.key = key;
this.val = val;
this.next = next;
}
}
class SequentialSearchST<K, V> {
Node<K, V> head;
int numOfData;
public void insert(K key, V val) {
for (Node<K, V> node = head; node != null; node = node.next) {
if (key.equals(node.key)) {
node.val = val;
return;
}
}
head = new Node<>(key, val, head);
numOfData++;
}
public void delete(K key) {
if (key.equals(head.key)) {
head = head.next;
numOfData--;
return;
}
for (Node<K, V> node = head; node.next != null; node = node.next) {
if (key.equals(node.next.key)) {
node.next = node.next.next;
numOfData--;
return;
}
}
}
public Iterable<K> keys() {
ArrayList<K> list = new ArrayList<K>();
for (Node<K, V> node = head; node != null; node = node.next)
list.add(node.key);
return list;
}
public V get(K key) {
if (head == null)
return null;
for (Node<K, V> node = head; node != null; node = node.next) {
if (key.equals(node.key))
return node.val;
}
return null;
}
}
第一個奧秘:您的哈希為5,因為您正在執行按位與運算。
如果將鍵輸入為'def',則String返回哈希值99333。在二進制文件中,即
0001 0100 0000 0101
和反對5:
0000 0000 0000 0101
並且只有那些都具有1的列將導致1:
0000 0000 0000 0101
...等於5。
第二個奧秘,您不是在反對M,而是在做另一個按位與。 您可以嘗試將最后一個更改為%:
private int hash(K key) {
int keyHash = key.hashCode();
keyHash = (keyHash & 0x7fffffff);
keyHash = keyHash % M; // <-- here
return keyHash;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.