哈希表-开放地址法之线性探测代码(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 < arraySize; 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 < n; 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);
    }
}