哈希表-开放地址法之线性探测代码(JAVA)
import java.io.*;
class DataItem { // 数据
private int iData; // data item (key)
public DataItem(int ii) {
iData = ii;
}
public int getKey() {
return iData;
}
}
class HashTable {// 数组实现的哈希表,开放地址法之线性探测
private DataItem[] hashArray; // 存放数据的数组
private int arraySize;
private DataItem nonItem; // 用作删除标志
public HashTable(int size) {// 构造函数
arraySize = size;
hashArray = new DataItem[arraySize];
nonItem = new DataItem(-1); // deleted item key is -1
}
public void displayTable() {// 显示哈希表
System.out.print("Table:");
for (int j = 0; j
if (hashArray[j] != null)
System.out.print(hashArray[j].getKey() + "");
else
System.out.print("**");
}
System.out.println("");
}
// 哈希函数
public int hashFunc(int key) {
return key % arraySize;
}
// 在哈希表中插入数据
public void insert(DataItem item) {
int key = item.getKey(); // 获取数据的键值
int hashVal = hashFunc(key); // 计算其哈希值
while (hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1) {
++hashVal; // 插入位置被占,线性探测下一位置
hashVal %= arraySize; // 不让超过数组的大小
}
hashArray[hashVal] = item; // 找到空位后插入
}
// 在哈希表中删除
public DataItem delete(int key) {
int hashVal = hashFunc(key); // 计算其哈希值
while (hashArray[hashVal] != null) {
if (hashArray[hashVal].getKey() == key) {
DataItem temp = hashArray[hashVal]; // 记录已删除的数据
hashArray[hashVal] = nonItem; // 删除它
return temp;
}
++hashVal; // 到下一单元找
hashVal %= arraySize;
}
return null; // 没有找到要删除的数据
}
// 在哈希表中查找
public DataItem find(int key) {
int hashVal = hashFunc(key); // 哈希这个键
while (hashArray[hashVal] != null) { // 直到空的单元
if (hashArray[hashVal].getKey() == key)
return hashArray[hashVal]; // 找到
++hashVal; // 去下一单元找
hashVal %= arraySize; // 不让超过数组的大小
}
return null; // 没有找到
}
}
public class HashTableApp {// 测试
public static void main(String[] args) throws IOException {
DataItem aDataItem;
int aKey, size, n, keysPerCell;
System.out.print("Enter size of hash table:");
size = getInt();
System.out.print("Enter initial number of items:");
n = getInt();
keysPerCell = 10;
HashTable theHashTable = new HashTable(size);
for (int j = 0; j
aKey = (int) (java.lang.Math.random() * keysPerCell * size);
aDataItem = new DataItem(aKey);
theHashTable.insert(aDataItem);
}
while (true) {
System.out.print("Enter first letter of");
System.out.print("show, insert, delete, or find:");
char choice = getChar();
switch (choice) {
case 's':
theHashTable.displayTable();
break;
case 'i':
System.out.print("Enter key value to insert:");
aKey = getInt();
aDataItem = new DataItem(aKey);
theHashTable.insert(aDataItem);
break;
case 'd':
System.out.print("Enter key value to delete:");
aKey = getInt();
theHashTable.delete(aKey);
break;
case 'f':
System.out.print("Enter key value to find:");
aKey = getInt();
aDataItem = theHashTable.find(aKey);
if (aDataItem != null) {
System.out.println("Found" + aKey);
} else
System.out.println("Could not find" + aKey);
break;
default:
System.out.print("Invalid entryn");
}
}
}
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
public static char getChar() throws IOException {
String s = getString();
return s.charAt(0);
}
public static int getInt() throws IOException {
String s = getString();
return Integer.parseInt(s);
}
}