使用無序陣列構建符號表ArrayST
阿新 • • 發佈:2018-11-14
其實說是無序陣列,其實也是使用佇列按照輸入的順序插入,和輸出。
資料如下:
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") 即可。