一、設計一個簡易數據庫系統,包含create,insert,select三個指令。
create(int tableId,int colNum,String key):創建表,其id為tableId,如果該表已存在,則不做任何處理。colNum為表中列的數量,列名由a-z字母組成,并按a-z順序編號。比如colNum=3,則代表列分別為a,b,c。
key為主鍵(指1列或多列組合),key中每個字符代表一列,如key=bc,表示主鍵由列b和列c組合。
insert(int tableId,int[] values):添加一條記錄。values每個元素按照順序一一對應每列的值。如果主鍵沖突,則不做任何處理。
select(int tableId,String[] conditions):根據條件查詢記錄,并按照主鍵升序輸出結果。其中condition僅為等于條件,比如b=32。
主鍵升序指的是按照keys中列出現的順序依次進行排序,每列按值大小升序輸出。如keys=ba,則先按照b列升序排序,如果b列值相同,則再按照a列升序排序。
樣例
create:1,3,a
insert:1,2 3 7
insert:1,4 5 6
insert:1,3 4 6
select:1, b=5 and c=6
輸出
4 5 6
二、算法實現
// 存放tableId和對應的值Map<Integer, List<int[]>> tables = new HashMap<>();// 存放tableId和主鍵Map<Integer, String> tableKey = new HashMap<>();// 存放主鍵對應的值,用于校驗是否有沖突Set<String> id = new HashSet<>();// 創建private void create(int tableId, int colNum, String keys) {if (!tables.containsKey(tableId)) {tables.put(tableId, new ArrayList<>());tableKey.put(tableId, keys);}}// 插入private void inset(int tableId, int[] values) {String keys = tableKey.get(tableId);char[] charArray = keys.toCharArray();StringBuilder sb = new StringBuilder();for (char c : charArray) {sb.append(values[c - 'a']).append(";");}sb.append(tableId);if (!id.contains(sb.toString())) {id.add(sb.toString());tables.get(tableId).add(values);}}// 查詢private List<int[]> select(int tableId, String[] conditions) {List<int[]> datas = tables.get(tableId);Map<Character, Integer> map = new HashMap<>();for (String condition : conditions) {String[] split = condition.split("=");map.put(split[0].charAt(0), Integer.valueOf(split[1]));}List<int[]> result = new ArrayList<>();for (int[] data : datas) {boolean match = true;for (Character c : map.keySet()) {int index = c - 'a';if (data[index] != map.get(c)) {match = false;break;}}if (match) {result.add(data);}}sortData(result, tableKey.get(tableId));return result;}// 對主鍵升序排序private void sortData(List<int[]> result, String key) {result.sort((o1, o2) -> {char[] charArray = key.toCharArray();for (char c : charArray) {int index = c - 'a';if (o1[index] != o2[index]) {return o1[index] - o2[index];}}return 0;});}