1. 程式人生 > >使用無序陣列構建符號表ArrayST

使用無序陣列構建符號表ArrayST

其實說是無序陣列,其實也是使用佇列按照輸入的順序插入,和輸出。

資料如下:

S E A R C H E X A M P L E

結果如下:

 *  S 0
 *  H 5
 *  X 7
 *  R 3
 *  C 4
 *  L 11
 *  A 8
 *  M 9
 *  P 10
 *  E 12

程式碼如下:

public class ArrayST<Key, Value> {
    private static final int INIT_SIZE = 8;

    private Value[] vals;   // 符號表的值
    private Key[] keys;     // 符號表的索引鍵
    private int n = 0;      // 符號表元素的數量

    // 初始化該符號表
    public ArrayST() {
        keys = (Key[])   new Object[INIT_SIZE];
        vals = (Value[]) new Object[INIT_SIZE];
    }

    // 根據 n 的大小返回符號表的大小
    public int size() {
        return n;
    }

    // 判斷符號表是否為空,根據 size() 是否為0 
    public boolean isEmpty() {
        return size() == 0;
    }

    // 根據引數調整符號表的大小,先定義好新陣列的長度,然後將原陣列的值賦值給對應新陣列的位置,最後將新陣列的陣列名賦值給原陣列。
    private void resize(int capacity) {
        Key[]   tempk = (Key[])   new Object[capacity];
        Value[] tempv = (Value[]) new Object[capacity];
        for (int i = 0; i < n; i++)
            tempk[i] = keys[i];
        for (int i = 0; i < n; i++)
            tempv[i] = vals[i];
        keys = tempk;
        vals = tempv;
    }

    // 往符號表裡面插入資料
    public void put(Key key, Value val) {

        // 刪除重複的鍵
        delete(key);

        // 如果陣列空間有限,則擴大兩倍陣列的長度
        if (n >= vals.length) resize(2*n);

        // 將資料加入陣列
        vals[n] = val;
        keys[n] = key;
        n++;
    }
    
    // 迴圈遍歷陣列的長度,若找到則返回對應的 val ,否則返回 null
    public Value get(Key key) {
        for (int i = 0; i < n; i++)
            if (keys[i].equals(key)) return vals[i];
        return null;
    }

    // 遍歷 keys 陣列的
    public Iterable<Key> keys() {
        Queue<Key> queue = new LinkedList<Key>();
        for (int i = 0; i < n; i++)
            queue.add(keys[i]);
        return queue;
    }

    // 將 key 和 value 刪除
    public void delete(Key key) {
        for (int i = 0; i < n; i++) {
            if (key.equals(keys[i])) {
                keys[i] = keys[n-1];
                vals[i] = vals[n-1];
                keys[n-1] = null;
                vals[n-1] = null;
                n--;
                if (n > 0 && n == keys.length/4) resize(keys.length/2);
                return;
            }
        }
    } 

    public static void main(String[] args) {
        ArrayST<String, Integer> st = new ArrayST<String, Integer>();
        for (int i = 0; !StdIn.isEmpty(); i++) {
            String key = StdIn.readString();
            st.put(key, i);
        }
        for (String s : st.keys())
            StdOut.println(s + " " + st.get(s));
    }
}

最後在命令列中編譯出現 「使用了未經檢查或不安全的操作」,只需在類前面加上 @SuppressWarnings("unchecked") 即可。